Android中的Handler和AsyncTask

1、Handler简介

Handler在android里负责发送和处理消息。它的主要用途:

  1)按计划发送消息或执行某个Runnanble(使用POST方法),类似定时器;

  2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程);

   默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback)可以指定线程),同时一个消息队列(MessageQueue和Looper封装)可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个Handler来处理)。

在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以sendMessage。

Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。

2、AsyncTask简介

AsyncTask与Handler一样都是用于处理UI线程中耗时操作的,而AsyncTask又有以下的一些特点:

(1)AsyncTask是抽象类,定义了三种泛型类型 Params,Progress,Result。Params 启动任务执行的输入参数,比如HTTP请求的URL;Progress 后台任务执行的百分比;Result 后台执行任务最终返回的结果,比如String。

(2)我们要实现一些方法,主要是这样四个:onPreExecute(),doInBackground(Params…),onProgressUpdate(Progress…),onPostExecute(Result)。从这些名字我们可以知道,onPreExecute()方法主要执行一些开始前的准备工作;doInBackground(Params…)方法在后台被调用,一般耗时的操作都放在这里执行;onProgressUpdate(Progress…)方法主要是显示进度条的更新,主要给用户展示现在的进行情况;onPostExecute(Result)方法会得到调用的结果。

3、区别

(1) 使用handler消息处理的时候,同时要使用线程处理,而AsyncTask本身就是一个线程处理机制。

(2)AsyncTask只能被调用一次,不能重复调用,否则会出现异常,而handler处理机制可以使用多个线程,只要指定不同的返回消息id值就可以了。

4、Handler实例

/** handler消息处理机制 */
private Handler handler = new Handler() {
	public void handleMessage(android.os.Message msg) {
		switch (msg.what) {
		case ConstantValues.GET_NET_SUCCEED:
			break;
		case ConstantValues.GET_NET_FAILED:
			// 获取网络失败
			break;
		case ConstantValues.DEL_RESULT_SUCCEED:
			break;
		case ConstantValues.DEL_RESULT_FAILED:
			break;
		default:
			break;
		}
	}

};
/**
 * 使用Get提交的构造方法
 *
 * @param handler
 *            消息对象
 * @param url
 *            请求的url地址
 */
public HttpGetThread(Handler handler, String url) {
	this.handler = handler;
	this.url = url;
}

@Override
public void run() {
	// 获取我们回调主ui的message
	Message msg = handler.obtainMessage();
	try {
		String result = HttpRequestUtils.doGet(url);
		msg.what = ConstantValues.GET_NET_SUCCEED;
		msg.obj = result;
	} catch (ClientProtocolException e) {
		msg.what = 404;
	} catch (IOException e) {
		msg.what = 100;
	}
	// 给主ui发送消息传递数据
	handler.sendMessage(msg);
}

5、AsyncTask的实例

private class GetDataTask extends AsyncTask<Void, Void, String[]> {

	@Override
	protected String[] doInBackground(Void... params) {
		// Simulates a background job.
		try {
			Thread.sleep(4000);
		} catch (InterruptedException e) {
		}
		return mStrings;
	}

	@Override
	protected void onPostExecute(String[] result) {
		mListItems.addFirst("Added after refresh...");
		mAdapter.notifyDataSetChanged();

		// Call onRefreshComplete when the list has been refreshed.
		mPullRefreshListView.onRefreshComplete();

		super.onPostExecute(result);
	}
}

6、总结

AsyncTask处理机制中,不需要使用复杂的线程调用与返回操作,如果我们处理单一的网络请求,可以直接使用该类实现其中的一些方法。而handler+thread的处理机制,需要自己定义线程去执行操作,同时也需要使用handler处理返回的结果,相对来说,适合在复杂的网络请求中自定义。

时间: 2024-11-03 21:18:16

Android中的Handler和AsyncTask的相关文章

Android中的Handler的具体用法

Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.Android利用Handler来实现UI线程的更新的. Handler是Android中的消息发送器,其在哪个Activity中创建就属于且紧紧属于该Activity.还可以说其在哪个线程中new的,就是那个线程的Handler. Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的U

Android中的Handler, Looper, MessageQueue和Thread

Android中的Handler, Looper, MessageQueue和Thread 前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系.虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易.合理地架构系统,并避免一些低级错误. 对于这部分的内容,将分成4小节来描述: 1.职责与关系 2.消息循环 3.线程与更新 4.几点小结 ------------------------------------------------

Android中的Handler

当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放在Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序就会挂掉.Handler就是把这些功能放到一个当初的线程里执行,与Activity互不影响. 一.Handler的定义:  Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中来接收.处理该消

Android中使用Handler造成内存泄露的分析和解决

什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用所指向,则该对象会在被GC发现的时候被回收:另外,如果一组对象中只包含互相的引用,而没有来自它们外部的引用(例如有两个对象A和B互相持有引用,但没有任何外部对象持有指向A或B的引用),这仍然属于不可到达,同样会被GC回收. Android中使用Handler造成内存泄露的原因 Handler mHand

深入源码解析Android中的Handler,Message,MessageQueue,Looper

本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文< Android中Handler的使用>,里面对Android为何以引入Handler机制以及如何使用Handler做了讲解. 概括来说,Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制.我们在使用Handler的时候与Message打交道最多,Message是Hanlder机制向开发人员暴露出来的相关类,可以通过Message类完成大部分操作Handler的功能.但

android中的Handler和Runnable

最近在做一个项目,在网络请求时考虑用Handler进行处理,然后就研究了一下Handler和Runnable 首先在看一下java中的Runnable The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread. The class must define a method of no arguments called run.

Android中利用Handler实现消息的分发机制(三)

在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而如果在子线程中需要去使用Handler的时候,我们就需要显式地去调用Looper的 prepare方法和loop方法,从而为子线程创建其唯一的Looper. 具体代码如下: class LooperThread extends Thread { public Handler mHandler; public void run()

Android中的Handler的机制与用法详解

概述: 很多android初学者对android 中的handler不是很明白,其实Google参考了Windows的消息处理机制, 在Android系统中实现了一套类似的消息处理机制.在下面介绍handler机制前,首先得了解以下几个概念:     1. Message 消息,理解为线程间通讯的数据单元.例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程.     2. Message Queue 消息队列,用来存放通过Handler发布的消息,按照先

android中的Handler和Callback机制

android中的Handler和Callback机制 - - ITeye技术网站 Handler主要用来在线程之间的通信的机制.如在Activity或Service中需要接受其他线程的消息,则在需要接收消息的Activity或Service中需要实现Handler.Callback接口,实现这个接口的: Java代码 ? public?boolean?handleMessage(?Message?inMessage?)?:?? public boolean handleMessage( Mes