zoukankan      html  css  js  c++  java
  • 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 }

     

  • 相关阅读:
    如何绕过chrome的弹窗拦截机制
    自我介绍
    注册页面的编写
    Roadmap学习目标
    Position
    poj2506 Tiling
    poj3278 Catch That Cow
    poj3624 Charm Bracelet
    钢条切割问题带你彻底理解动态规划
    poj1328 Radar Installation
  • 原文地址:https://www.cnblogs.com/wizzhangquan/p/2981721.html
Copyright © 2011-2022 走看看