1. HandlerThread是什么?
HandlerThread本质上是一个线程类,它继承了Thread;
HandlerThread有自己的内部的Looper对象,可以进行looper循环;
通过获取HandlerThread的looper对象传递给Handler对象,可以在handleMessage方法中执行异步任务;
2. HandlerThread产生背景:
当面试官在问我们Handler在子线程中怎么发送消息,这时候有人就会说了,我们可以拿到主线程的Looper或者通过手动调用Looper.prepare和Looper.loop,这显然是可以的,这时候面试官可能来了一句:还有其他方式嘛?瞬间懵逼,有没有!!(如果没接触过HandlerThread)其实,这种在子线程中发送消息的情况,google工程师早就给我们提供了,这就是HandlerThread的产生背景,它不需要我们去拿主线程的Looper,也不用手动调用Looper.prepare和Looper.loop,它已经封装了Looper,并手动调用了这两个方法。
3. HandlerThread的特点:
- HandlerThread本质上是一个线程类,它继承了Thread;
- HandlerThread有自己的内部的Looper对象,可以进行looper循环;
- 通过获取HandlerThread的looper对象传递给Handler对象,可以在handleMessage法中执行异步任务;
- 优点是不会有阻塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理,处理效率较低。
- 与线程池注重并发不同,HandlerThread是一个串行队列,HandlerThread背后只有一个线程。
4. HandlerThread的机制原理:
HandlerThread是继承Thread类的,本质上是一个线程类,代码比较简单,主要看两个方法run()和getLooper()。
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
在run方法中调用了Looper.prepare,创建了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;
}
喜欢本篇博客的简友们,就请来一波点赞,您的每一次关注,将成为我前进的动力,谢谢!