前言
HandlerThread对象开启的工作线程,如果一直不退出,且也没有执行任务时并不会占用CPU资源,我们在项目中一般会选择一直留存一个HandlerThread对象表示的工作线程,方便我们随时向此工作线程中发起一个耗时的任务,不过HandlerThread仍然提供了可以退出工作线程的API,即下面两个方法
quit()方法分析
public boolean quit() {
Looper looper = getLooper();
if (looper != null) {
looper.quit();
return true;
}
return false;
}
用于结束工作线程的方法,只要结束Looper的循环,工作线程即会退出。特点:不会等待正在执行的任务,会立刻终止工作线程
1、先得到与当前线程相关的Looper对象,由局部变量looper持有
2、检查Looper
当looper不为空时,最终调用它的quit()方法完成退出,并向调用者返回true,表示退出成功
3、Looper没有创建时,向调用者返回false,表示退出失败
quitSafely()方法分析
public boolean quitSafely() {
Looper looper = getLooper();
if (looper != null) {
looper.quitSafely();
return true;
}
return false;
}
用于结束工作线程的方法,只要结束Looper的循环,工作线程即会退出,特点:等待所有正在执行的Message都处理完,才会退出工作线程
此处调用的是Looper对象的quitSafely()方法完成退出!
总结
1、HandlerThread的退出,完全调用的是Looper对象的方法
2、Looper的quit()、quitSafely()决定了退出方式的不同,参见Looper源码,Looper会调用MessageQueue的退出方法
、