HandlerThread源码阅读
HandlerThread源码,先看下注释:
意思是,HandlerThread是一个拥有Looper的线程。 该looper对象可以用来创建Handler对象。
看下构造方法:
初始化线程名,以及线程优先级。该线程默认优先级为0
其他方法:
1、run方法
线程启动后自动调用。
步骤:
(1)保存线程id
(2)再调用Looper.prepare()方法为该线程实例化Looper对象
(3)获取到looper对象后再调用notifyAll() 方法唤醒另一个在等待锁(即该thread对象)释放的线程。
(4)设置线程优先级
(5)调用onLooperPrepared方法在该线程执行任务前做一些设置工作。
(6)调用Looper.loop()启动消息循环。
2、getLooper方法
获取这个HandlerThread的Looper对象。调用这个方法时,如果looper对象还没生成,该方法会短暂阻塞当前调用线程(86行的wait方法等待looper对象生成后唤醒)。 当该HandlerThread启动后,会调用notifyAll唤醒当前线程。
3、getThreadHandler方法
返回一个handler,用于处理该线程消息。这是一个隐藏api。实际需要启动该handlerThread后自己构造这个handler
4、quit、quitSafely方法
退出消息循环
可以看出HandlerThread用于实现多线程任务处理,其封装了Looper初始化及其消息循环。 实际开发中,这样使用,代码如下。注意,需要先启动HandlerThread再获取其Looper对象,不然获取不到looper对象。
另外,当需要终止handlerThread时记得调用quit或quitSafely。其中quitSafely会等消息都处理完再退出消息循环。