HandlerThread extends Thread:
- 本质依然是一个Thread,只不过进行了队列化的包装,使得Handler能与其配合工作.
初始化时必须指定Thread的name, 但是Priority可以使用默认的Process.THREAD_PRIORITY_DEFAULT.
其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.
getThreadId()会返回mTid
getLooper():
- 如果Thread已经死了(!isAlive()), 直接返回null.
- 否则同步自己(原因上面说过了), 一个while(isAlive() && mLooper == null) 调用wait(), 中间有任何的InterruptedException会catch住,在run()中Looper就绪以后,会notifyAll()引发一个InterruptedException,这时候mLooper != null,退出循环等待, 返回mLooper
quit()/quitSafely():
- 在获取到可用的Looper后,调用looper的quit()/quitSafely(), 两者的区别:
- quit(): looper直接终止,不再处理在MessageQueue中的Message. quit()之后,再postMessage会fail.
- quitSafely(): 让looper尽可能快的将MessageQueue中所有已经到期需要执行的Message进行执行然后再终止,其他没有到期的Task则被drop, 再postMessage会fail.
- 如果thread尚未开始,或者已经结束,那么会返回false.
- 在获取到可用的Looper后,调用looper的quit()/quitSafely(), 两者的区别:
Android HandlerThread 源码笔记
最新推荐文章于 2024-06-24 01:35:01 发布
本文详细解读了HandlerThread的工作原理及其实现细节,包括如何初始化、线程优先级设置、Looper的准备与循环执行过程,以及如何通过quit()和quitSafely()方法来控制线程生命周期。同时,阐述了HandlerThread在Android开发中的重要作用,特别是与主线程和子线程之间的消息传递机制。

610

被折叠的 条评论
为什么被折叠?



