Android&HandlerThread分析

HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。这个Looper其实就是对消息队列以及队列处理逻辑的封装,简单说就是 消息队列+消息循环。

当我们需要一个工作者线程,而不是把它当作一次性消耗品,用过即废弃的话,就可以使用它。

some.java
 1 private Handler mHandler = null;
 2 
 3     private HandlerThread mHandlerThread = null;
 4     private void sentRunnableToWorker(Runnable run){
 5         if (null == mHandlerThread)
 6         {
 7             mHandlerThread = new HandlerThread("WorkerThread");
 8             // 给工作者线程低优先级 
 9             mHandlerThread.setPriority(Thread.MIN_PRIORITY);
10             mHandlerThread.start();
11         }
12 
13         if (null == mHandler)
14             mHandler = new Handler(mHandlerThread.getLooper());
15 
16         mHandler.post(run);
17     }
18 /*AsyncQueryHandler就是基于HandlerThread封装了线程间双向通信,而HandlerThread只做了一半。*/

 

源码分析:

 1 public class HandlerThread extends Thread{
 2           //线程的优先级
 3            private int mPriority;
 4           //线程的id
 5            private int mTid=-1;
 6            private Looper mLooper;
 7            public HandlerThread(String name){
 8                       super(name);
 9                      //设置优先级为默认线程
10                      mPriority=Process.THREAD_PRIORITY_DEFAULT;
11            }
12            public HandlerThread(String name,int priority){
13                       super(name);
14                      mPriority=priority;
15            }
16           /*这个如果有需要的话可以继承重写,例如可以在里面声明Handler 关联此线程。*/
17            protected void onLooperPrepared(){}
18            //这个很熟悉吧
19            public void run(){
20                //得到当前线程的id
21                 mTid=Process.myTid;
22                /*一旦调用这句代码,就在此线程中创建了Looper 对象。这就是为什么我们要在调用线程的start()方法后
23                才能得到Looper 对象即 当 调用Looper.myLooper()时不为Null。*/
24                 Looper.prepare();
25                 /*同步代码块,意思就是当获得mLooper对象后,唤醒所有线程。(会在以后的例子中有所体现)*/
26                synchronized(this){
27                      mLooper=Looper.myLooper();
28                      notifyAll();
29                }
30               //设置线程的优先级
31                Process.setThreadPriority(mPriority);
32              //调用上面的方法(需要用户重写)
33               onLooperPrepared();
34                //建立了消息循环
35                 Looper.loop();
36                mTid=-1;
37            }
38            public Looper getLooper(){
39                     //线程死了,那就只有NULL了。
40                      if(!isAlive()){
41                         return null;
42                     }
43             /*看见没,又是同步代码块,正好和上面的形成对应,就是说只要线程活着并且我的looper为NULL,那么我就让你一直等。。。*/
44                    synchronized(this){
45                           while(isAlive()&&mLooper==null){
46                                try{
47                                          wait();
48                                    }catch(InterruptedException e){}
49                           }
50                    }
51                              return mLooper;
52            }
53           public boolean quit(){
54               Looper looper =getLooper();
55                if(looper!=null){
56                   //退出消息循环
57                    looper.quit();
58                    return true;
59               }
60               return false;
61        }
62          //返回线程ID
63          public int getThreadId(){
64                return mTid;
65         }
66 }

 

 

posted on 2013-03-25 23:50  Zachary_wiz  阅读(251)  评论(0编辑  收藏  举报

导航