记录下HandlerThread的分析

HandlerThread  内部会持有一个Handler,  算是Handler和Thread的一个合体,

 HandlerThread.start() 的话执行run这个方法,截下源码:

@Override
public void run() {
    mTid = Process.myTid();
    Looper.prepare();
    synchronized (this) {
        mLooper = Looper.myLooper();
        notifyAll();
    }
    Process.setThreadPriority(mPriority);
    onLooperPrepared();
    Looper.loop();
    mTid = -1;
}

抽取几个关键步骤:  1.    获取Looper   2.  Looper开始循环

Looper.prepare() 这个方法会帮助构建出一个Looper,  这个Looper会被存在Looper的sThreadLocal这个变量里, 这个sThreadLocal是线程本地存储,独一份。 

Looper.myLooper()这个方法通过sThreadLocal.get()拿到Looper, 

Looper.loop()  开始Looper循环,

for (;;) {
    Message msg = queue.next(); // might block
    if (msg == null) {
        // No message indicates that the message queue is quitting.
        return;
    }

开启了死循环,不断遍历MessageQueue,  消息为空会退出循环, 

使用场景分析: 

     这个Handler属于这个线程的,这个线程对应有一个Looper, 

Handler :  Looper :  Thread  这三者是1 :1 : 1的关系,  

     在需要给这个Thread通信的时候, 可以借助HandlerThread ,通过handler发送消息给这个线程,源码截取: 
  

/**
 * @return a shared {@link Handler} associated with this thread
 * @hide
 */
@NonNull
public Handler getThreadHandler() {
    if (mHandler == null) {
        mHandler = new Handler(getLooper());
    }
    return mHandler;
}

如何退出消息循环 ?

 HandlerThread 提供了一个quit方法

 

public boolean quit() {
    Looper looper = getLooper();
    if (looper != null) {
        looper.quit();
        return true;
    }
    return false;
}

通过quit方法可以退出消息循环,  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值