HandlerThread

在上一篇 android耗时任务_handler中介绍了handler的运作机制,并且介绍了一个普通线程中产生looper并使用handler机制通信的简单例子。我们知道在普通线程中是没有looper的,也就不好在普通线程空间中使用handler机制,如果每次都像上一篇的例子那样做的话就会略显麻烦。其实Android已经封装了一个拥有自己looper的线程HandlerThread,它的实现和上一篇中给出的例子基本一,只是更加专业一点。下面是此类的详细代码。
public class HandlerThread extends Thread {    private int mPriority;      private int mTid =-1;     private Looper mLooper;      publicHandlerThread(String name) {        super(name);        mPriority =Process.THREAD_PRIORITY_DEFAULT;    }     publicHandlerThread(String name, int priority) {        super(name);        mPriority =priority;    }     protected void onLooperPrepared() {    }     public void run() {        mTid =Process.myTid();        Looper.prepare();        synchronized(this) {            mLooper =Looper.myLooper();            notifyAll();           }       Process.setThreadPriority(mPriority);       onLooperPrepared();        Looper.loop();          mTid = -1;    }     public Looper getLooper() {        if (!isAlive()) {            return null;        }         // If the threadhas been started, wait until the looper has been created.        synchronized(this) {            while(isAlive() && mLooper == null) {                try {                   wait();                } catch(InterruptedException e) {                }            }        }        return mLooper;    }     public boolean quit(){        Looper looper =getLooper();        if (looper !=null) {           looper.quit();            return true;        }        return false;    }     public intgetThreadId() {        return mTid;    }}
此类就是继承了Thread类,使用此类时一定要注意必须start(),否则run()方法没有调用,handler机制也就没有建立起来。

经典应用

对于HandlerThread的一个经典应用就是在service中的应用,我们知道,一般而言service是运行在主线程中的,在 android耗时任务_ANR中我也建议在BroadcastReceiver中启动service,在service中启动线程处理耗时任务。那么如何启动线程,下面给出一个经典的代码:

public class BackService extends Service {private ServiceHandler serviceHandler;@Overridepublic IBinder onBind(Intent arg0) {return null;}private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);onHandleIntent((Intent) msg.obj);// 在其参数startId跟最后启动该service时生成的ID相等时才会执行停止服务。stopSelf(msg.arg1);}}@Overridepublic void onCreate() {super.onCreate();HandlerThread thread = new HandlerThread("BackService");thread.start();Looper serviceLooper = thread.getLooper();serviceHandler = new ServiceHandler(serviceLooper);}@Overridepublic void onStart(Intent intent, int startId) {Message msg = serviceHandler.obtainMessage();msg.arg1 = startId;msg.obj = intent;serviceHandler.sendMessage(msg);}protected void onHandleIntent(Intent intent) {               //做你的异步任务}}





更多相关文章

  1. Android 引入广播机制的用意
  2. Android Intent机制实例详解(Activity篇)
  3. Android的垃圾回收机制
  4. Android线程与异步消息处理机制
  5. android的消息处理机制(Looper,Handler,Message)

随机推荐

  1. 使用localStorage实现的改变页面样式
  2. Assert.assertEquals的使用方法及注意事
  3. 完美解决VMware安装后没有VMnet1和VMnet8
  4. JS基础知识:JS对象模拟数组方法用法实例分
  5. Java如何实现登录token令牌
  6. 使用MybatisPlus自定义模版中能获取到的
  7. Android(安卓)相机实例(一)
  8. Android源码目录结构详解
  9. Android(安卓)Volley.jar包下载
  10. Ubuntu10.04 32位编译Android(安卓)4.0源