HandlerThread是一套安全的使用Handler机制的线程,在Thread中创建Handler并且使用Handler和线程通信也是一种任务调度场景,而在Thread中创建Handler需要考虑到线程安全以及同步的问题。
1.线程start之后,并不会立刻进入run方法中,也就是说在线程中使用Looper.prepare()然后再start线程,并不能够立刻就创建Looper对象,此时直接去获取Looper是null。
2.线程的同步问题,Looper对象在创建的时候需要做好同步,否则在多个线程创建的时候会导致Looper重复创建,进而使app崩溃。
HandlerThread很好的处理好了这2个问题,首先对于第一个问题,在线程start之后,我们使用getLooper()获取Looper的时候,当Looper对象还没创建,就会使线程进入等待状态,直到Looper对象创建完成并且返回。
public Looper getLooper() {
if (!isAlive()) {
return null;
}
// If the thread has been started, wait until the looper has been created.
synchronized (this) {
while (isAlive() && mLooper == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
return mLooper;
}
在run方法中HandlerThread在创建Looper对象的时候也做好了同步。
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
同时开放出onLooperPrepared()方法给子类继承扩展,类似于Activity中的onCreate方法。
另外Handler还提供了退出HandlerThread的方法。
public boolean quitSafely() {
Looper looper = getLooper();
if (looper != null) {
looper.quitSafely();
return true;
}
return false;
}
/**
* Returns the identifier of this thread. See Process.myTid().
*/
public int getThreadId() {
return mTid;
}
网友评论