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处理返回的结果,相对来说,适合在复杂的网络请求中自定义。



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。