HandlerThread简介
HandlerThread继承自Thread类,用于启动一个具有looper的线程,start方法必须调用。其内部创建了Hanlder和looper,方便调用者使用。
HandlerThread源码分析
public class HandlerThread extends Thread {
int mPriority;
int mTid = -1;
Looper mLooper;
private @Nullable Handler mHandler;
内部有两个成员变量,Looper 和 Handler 重点看下其run方法
@Override
public void run() {
mTid = Process.myTid();
创建looper
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
looper启动loop循环
Looper.loop();
mTid = -1;
}
run方法中开启一个looper循环,因此当不需要使用,最好通过quit或者quitSafely来终止线程的执行。两者的区别在于quitSafely会执行完所有消息队列中的消息再退出,而quit则直接退出。
Handler的赋值,注释说明返回一个与此线程相关联的一个共享的Handler
/**
* @return a shared {@link Handler} associated with this thread
* @hide
*/
public Handler getThreadHandler() {
if (mHandler == null) {
mHandler = new Handler(getLooper());
}
return mHandler;
}
HandlerThread的应用
IntentService中使用的例子
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
可以看到线程开启后,获取线程的looper,同时创建一个新的Handler,绑定这个Looper,以便通过此Handler想looper中发送消息。