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