Android HandlerThread 源码笔记

本文详细解读了HandlerThread的工作原理及其实现细节,包括如何初始化、线程优先级设置、Looper的准备与循环执行过程,以及如何通过quit()和quitSafely()方法来控制线程生命周期。同时,阐述了HandlerThread在Android开发中的重要作用,特别是与主线程和子线程之间的消息传递机制。
  1. HandlerThread extends Thread:

    • 本质依然是一个Thread,只不过进行了队列化的包装,使得Handler能与其配合工作.
  2. 初始化时必须指定Thread的name, 但是Priority可以使用默认的Process.THREAD_PRIORITY_DEFAULT.

  3. 其run()函数的逻辑很简单:

    • 首先获取Tid就是Thread的Id.
    • 然后调用Looper.prepare().
    • 同步HandlerThread对象(synchronized (this)), 将mLooper设置为当前线程的Looper(TLS, 并且notifyAll(), 需要同步和notify的原因是HandlerThread的getLooper()在HandlerThread没有run()起来的时候是是需要同步wait()的)
    • Process.setThreadPriority(mPriority)设置Thread自己的优先级.
    • onLooperPrepared(); 回调.
    • Looper.loop() 开始干活,loop()不断的从自己的MessageQueue中取出Message进行执行.
    • 如果loop()结束,那么代表这个HandlerThread也即将结束,会将mTid设置为-1.
  4. getThreadId()会返回mTid

  5. getLooper():

    • 如果Thread已经死了(!isAlive()), 直接返回null.
    • 否则同步自己(原因上面说过了), 一个while(isAlive() && mLooper == null) 调用wait(), 中间有任何的InterruptedException会catch住,在run()中Looper就绪以后,会notifyAll()引发一个InterruptedException,这时候mLooper != null,退出循环等待, 返回mLooper
  6. quit()/quitSafely():

    • 在获取到可用的Looper后,调用looper的quit()/quitSafely(), 两者的区别:
      • quit(): looper直接终止,不再处理在MessageQueue中的Message. quit()之后,再postMessage会fail.
      • quitSafely(): 让looper尽可能快的将MessageQueue中所有已经到期需要执行的Message进行执行然后再终止,其他没有到期的Task则被drop, 再postMessage会fail.
    • 如果thread尚未开始,或者已经结束,那么会返回false.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值