1 特点
HandlerThread继承thread,也是一个线程。但是它自带Looper对象。
既然是一个thread,肯定要看run方法。
而且内部有Looper。轮训机制对象
有Handler对象,可以处理消息。但是getThreadHandler方法隐藏方法,正常途径拿不到
* Handy class for starting a new thread that has a looper. The looper can then be
* used to create handler classes. Note that start() must still be called.
public class HandlerThread extends Thread {
Looper mLooper;
private @Nullable Handler mHandler;
//两个构造方法,name 优先级
public HandlerThread(String name) {
super(name);
mPriority = Process.THREAD_PRIORITY_DEFAULT;
}
public HandlerThread(String name, int priority) {
super(name);
mPriority = priority;
}
}
2. run 方法
@Override
public void run() {
mTid = Process.myTid();
//创建looper对象,把looper对象放入threadlocal里
//不明白可以查阅looper handler源码
Looper.prepare();
synchronized (this) {
//从threadlocal里获取当前的looper对象。
mLooper = Looper.myLooper();
//唤醒队列消息
notifyAll();
}
Process.setThreadPriority(mPriority);
//开始轮训前的准备工作
onLooperPrepared();
//开始轮训
Looper.loop();
mTid = -1;
}
3.使用
// 步骤1:创建HandlerThread实例对象
// 传入参数 = 线程名字,作用 = 标记该线程
HandlerThread mHandlerThread = new HandlerThread("handlerThread");
// 步骤2:启动线程
mHandlerThread.start();
// 步骤3:创建工作线程Handler & 复写handleMessage()
// 作用:关联HandlerThread的Looper对象、实现消息处理操作 & 与其他线程进行通信
// 注:消息处理操作(HandlerMessage())的执行线程 = mHandlerThread所创建的工作线程中执行
Handler workHandler = new Handler( mHandlerThread.getLooper() ) {
@Override
public boolean handleMessage(Message msg) {
...//消息处理
return true;
}
});
// 步骤4:使用工作线程Handler向工作线程的消息队列发送消息
// 在工作线程中,当消息循环时取出对应消息 & 在工作线程执行相关操作
// a. 定义要发送的消息
Message msg = Message.obtain();
msg.what = 2; //消息的标识
msg.obj = "B"; // 消息的存放
// b. 通过Handler发送消息到其绑定的消息队列
workHandler.sendMessage(msg);
// 步骤5:结束线程,即停止线程的消息循环
mHandlerThread.quit();