HandlerThread 其实就是一个普通的Thread,唯一不同的是可以使用Handler的Thread。
举个例子
mHandlerThread = new HandlerThread("handler_thread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//这里是子线程 线程名称handler_thread
Log.d("AAA",Thread.currentThread().getName());
}
};
Log.d("AAA",Thread.currentThread().getName());
new Thread(new Runnable() {
@Override
public void run() {
mHandler.sendEmptyMessageDelayed(1,3000);
}
}).start();
}
@Override
public void onClick(View v) {
mHandler.sendMessage(Message.obtain());
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandlerThread.quit();
}
打印的结果
main
handler_thread
handler_thread
无论是主线程还是子线程,都可以把消息发送给mHandler的handleMessage处理,值得注意的是,mHandler虽然实在主线程创建了实例,但是handleMessage方法却是运行在子线程。
实现原理很简单,跟之前 Android消息机制(四)—Handler分析中的原理一样,根据一个Thread对应一个Looper来实现。
看run方法
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
在run方法发中创建了Looper,开启了loop,无限循环,所以只需要将该looper设置给handler,就会将消息添加到当前Looper对应Thread的MessageQueue中。
public Handler(Looper looper, Callback callback, boolean async) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = callback;
mAsynchronous = async;
}