Handler是Android中非常重要的类之一,通过Handler可以实现主线程的延时操作和线程之间的通信,通过在子类中的Handle、和Looper可以很轻松的实现一个请求队列。
在写代码之前首先简要的说一下 Handler、Looper、MessageQuene之间的关系。
每一个线程最多有一个Looper、一个Looper里边含有一个MessageQuene。
Handler每次将消息发送到MessageQuene中,Looper用过一个死循环不断的从MessageQuene中获取消息,获取后,根据Message的target分发给对应的Handler进行处理。
下边是我写的一个通过Handler和Looper实现的请求队列:
package com.hou.looper; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; public class DemoLooperActivity extends Activity { private MyThread myThread = new MyThread(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /*********** 模拟两个任务 ***********/ postToNoneUIThread(new Runnable() { @Override public void run() { try { Log.e("", "5 start"); Thread.sleep(5000); Log.e("", "5 end"); } catch (InterruptedException e) { e.printStackTrace(); } } }); postToNoneUIThread(new Runnable() { @Override public void run() { try { Log.e("", "1 start"); Thread.sleep(1000); Log.e("", "1 end"); } catch (InterruptedException e) { e.printStackTrace(); } } }); /*********** 模拟两个任务OVER ***********/ } public void runOnNoneUIThread(Runnable r) { new Thread(r).start(); } /** * 放入到子线程队列中 * */ public void postToNoneUIThread(Runnable r) { // 执行到这里的时候,子线程可能尚未启动,等待子线程启动,等待的时间会很短, while (myThread.handler == null) { } myThread.handler.post(r); myThread.handler.sendEmptyMessage(100); } /** * 可以设计为网络请求队列 * */ class MyThread extends Thread { { start(); // 类加载完成后直接启动 } private Handler handler; @Override public void run() { while (true) { Looper.prepare(); // 创建该线程的Looper对象 handler = new Handler(Looper.myLooper()) { public void handleMessage(android.os.Message msg) { Log.i("handleMessage", "" + msg.what); }; }; Looper.loop(); // 这里是一个死循环 // 此后的代码无法执行 } } } }