HandlerThread 源码分析

1 特点

HandlerThread继承thread,也是一个线程。但是它自带Looper对象。
既然是一个thread,肯定要看run方法。
而且内部有Looper。轮训机制对象
有Handler对象,可以处理消息。但是getThreadHandler方法隐藏方法,正常途径拿不到

 * Handy class for starting a new thread that has a looper. The looper can then be 
 * used to create handler classes. Note that start() must still be called.
 
public class HandlerThread extends Thread {
    
    

   	Looper mLooper;
    private @Nullable Handler mHandler;

	//两个构造方法,name   优先级
    public HandlerThread(String name) {
    
    
        super(name);
        mPriority = Process.THREAD_PRIORITY_DEFAULT;
    }
     public HandlerThread(String name, int priority) {
    
    
        super(name);
        mPriority = priority;
    }
}

2. run 方法

    @Override
    public void run() {
    
    
        mTid = Process.myTid();
        //创建looper对象,把looper对象放入threadlocal里
        //不明白可以查阅looper handler源码
        Looper.prepare();
        synchronized (this) {
    
    
        	//从threadlocal里获取当前的looper对象。
            mLooper = Looper.myLooper();
            //唤醒队列消息
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        //开始轮训前的准备工作
        onLooperPrepared();
        //开始轮训
        Looper.loop();
        mTid = -1;
    }

3.使用

// 步骤1:创建HandlerThread实例对象
// 传入参数 = 线程名字,作用 = 标记该线程
   HandlerThread mHandlerThread = new HandlerThread("handlerThread");

// 步骤2:启动线程
   mHandlerThread.start();

// 步骤3:创建工作线程Handler & 复写handleMessage()
// 作用:关联HandlerThread的Looper对象、实现消息处理操作 & 与其他线程进行通信
// 注:消息处理操作(HandlerMessage())的执行线程 = mHandlerThread所创建的工作线程中执行
  Handler workHandler = new Handler( mHandlerThread.getLooper() ) {
    
    
            @Override
            public boolean handleMessage(Message msg) {
    
    
                ...//消息处理
                return true;
            }
        });

// 步骤4:使用工作线程Handler向工作线程的消息队列发送消息
// 在工作线程中,当消息循环时取出对应消息 & 在工作线程执行相关操作
  // a. 定义要发送的消息
  Message msg = Message.obtain();
  msg.what = 2; //消息的标识
  msg.obj = "B"; // 消息的存放
  // b. 通过Handler发送消息到其绑定的消息队列
  workHandler.sendMessage(msg);

// 步骤5:结束线程,即停止线程的消息循环
  mHandlerThread.quit();

Guess you like

Origin blog.csdn.net/chentaishan/article/details/118584100