1、工作原理
- 继承 Thread,可以创建一个带 Looper 对象的工作线程。
- 封装 Handler,与其他线程进行通信。
2、源码分析
public class HandlerThread extends Thread {
int mPriority;
int mTid = -1;
Looper mLooper;
private @Nullable Handler mHandler;
// 创建 HandlerThread 可以设置线程的名字和优先级。
public HandlerThread(String name) {
super(name);
mPriority = Process.THREAD_PRIORITY_DEFAULT;
}
public HandlerThread(String name, int priority) {
super(name);
mPriority = priority;
}
/**
* Call back method that can be explicitly overridden if needed to execute some
* setup before Looper loops.
*/
protected void onLooperPrepared() {
}
// 调用 start() 执行线程。
@Override
public void run() {
// 1.当前线程 id。
mTid = Process.myTid();
// 2.创建 Looper、MessageQueue。
Looper.prepare();
// 3.通过 synchronized 获取 Looper,notifyAll() 释放锁。保证 getLooper()时 Looper 已经创建。
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
// 4.设置线程优先级。
Process.setThreadPriority(mPriority);
// 5.线程循环前准备工作。
onLooperPrepared();
// 6.消息循环。
Looper.loop();
mTid = -1;
}
// 获取 HandlerThread 线程 Looper 对象。
public Looper getLooper() {
if (!isAlive()) {
return null;
}
// 线程存活且mLooper == null 时阻塞,直到 notifyAll() 唤醒。
synchronized (this) {
while (isAlive() && mLooper == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
return mLooper;
}
@NonNull
public Handler getThreadHandler() {
if (mHandler == null) {
mHandler = new Handler(getLooper());
}
return mHandler;
}
// 退出当前线程消息循环。
// 1.quit(),移除消息队列的所有消息并设为 null。
// 2.quitSafely(),先判断消息队列是否正在处理消息,是则处理完消息在退出,否则直接退出。
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;
}
}