Thread之前说的多了,HandlerThread了解么,今天来说说他和Thread的区别
我们知道要开启一个Thread并绑定给一个Handler的话,必须用Looper启动一个消息队列,大概的代码会像下面这样
Handler workerHandler;
private void initThread() {
Thread worker = new Thread(){
@Override
public void run() {
super.run();
Looper.prepare();
workerHandler = new Handler(Looper.myLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
....
Looper.loop();
}
};
worker.start();
}
程序员都比较懒,如果想把Looper的代码给省了,可以用HandlerThread,代码变成这样
private void initThread() {
HandlerThread worker = new HandlerThread("");
worker.start();
Handler workerHandler = new Handler(worker.getLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
}
我们不用在Thread的run方法里手动的去启动一个Looper,HandlerThread帮我们完成了这部分事情。
其实原理很简单,我们看HandlerThread的源码就明白,它重写了run方法,在里面帮我们prepare了Looper
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
· HandlerThread的 getLooper是个阻塞方法,在Thread的Looper没准备好之前,是会调用 wait()阻塞当前线程的 · 因为HandlerThread会帮我们启动Looper,因此在我们不需要它的时候,记得一定要调用quit/quitSafely,否则会创建越来越多的线程导致OOM。