上周辞职了空出来一周时间来,本来想好好充充能, 结果这几天同学过来找工作,陪他跑了好几天。一周没怎么敲代码总感觉生活中少了点什么东西。闲话不多说,接下来讲讲今天的主角HandlerThread。我之前对HandlerThread的理解也就一知半解的,直到这几天对Handler和HandlerThread的源码看了一遍后才终于明白这个类的作用
我们直到主线程中创建Handler会在主线程中创建Looper和MessageQueue,并且利用Looper和MessageQueue来构建消息循环系统。那么HandlerThread的作用是我们呢?我们先来看一下源码
HandlerThread源码
public class HandlerThread extends Thread {
int mPriority;
int mTid = -1;
Looper mLooper;
public HandlerThread(String name) {
super(name);
mPriority = Process.THREAD_PRIORITY_DEFAULT;
}
public HandlerThread(String name, int priority) {
super(name);
mPriority = priority;
}
protected void onLooperPrepared() {
}
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
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;
}
public boolean quit() {
Looper looper = getLooper();
if (looper != null) {
looper.quit();
return true;
}
return false;
}
public boolean quitSafely() {
Looper looper = getLooper();
if (looper != null) {
looper.quitSafely();
return true;
}
return false;
}
public int getThreadId() {
return mTid;
}
}
总个类也就100来行,逻辑十分简单,在子线程调用Looper.prepare()来创建Looper对象,Looper的构造方法中会创造一个MessageQueue,调用Looper.loop()方法来轮循MessageQueue;利用HandlerThread我们可以将Looper操作放到子线程中去执行,降低了主线程的压力,使主线程更加流畅
我们看到源码中又两个方法quit和quitSafely我们来看看他们的区别:
quit():调用Looper.prepare()方法创建的Looper的quit方法,直接退出Looper,Looper退出后,通过Handler发出的消息会失败
Handler的send方法会返回false,在Thread中如果手动创建Looper,那么在所有的事情完成以后应该手动的调用quit方法
终止消息循环,这个线程就会立即终止掉
quitSafely():调用Looper.prepare()方法创建的Looper的quitSafely()方法,quitSafely()只是设定一个退出标记
然后把消息队列中的已有消息处理完毕后才安全的退出
HandlerThread的使用
HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();//必须先开启线程,来创建Looper
mHandler = new Handler(thread.getLooper());
mHandler.post(new Runnable(){...});
使用HandlerThread是为了用此子线程的Looper和Looper中的MessageQueue,最终Message是send到该子线程的handleMessage()中去运行