HandlerThread该对象其实系统内部使用的比较多,比如IntentService。而调用者一般不会去直接使用。
不过HandlerThread源码非常简单。实现也谈不上有太多技巧性。不过还是蛮实用的。简化了子线程Handler的使用。一般的场景下也用不上。
Handler的使用场景是,需要在某个时候,让子线程去完成某个逻辑。类似于后台任务。而且,不会有结果回调处理,需要把结果回调出来的话,需要再创建一个主线程Handler去做这件事。
首先,HandlerThread是Thread的子类。然后,里面最重要的方法,就是run()方法了。
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
代码非常短。首先,创建并获取了当前线程的Looper对象。然后调用了Looper.loop()方法了。我们知道loop()方法的作用就是将对应的MessageQueue中的Message对象一个一个取出来,然后调用Handler#dispatchMessage(msg)方法。
另外,在线程开启的时候,也就是用户调用了HandlerThread#start()的时候,回调了一个方法onLooperPrepared();该方法在loop()之前,且只会调用一次。
通过这个run()方法,我们就知道HandlerThread的原理了。本质上,就是开启了一个线程,然后在线程中创建对应的Looper对象。
使用示例:
private HandlerThread background;
private Handler backHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_self);
findViewById(R.id.button_click)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.v(TAG, "click this button...");
backHandler.sendEmptyMessage(27);
}
});
background = new HandlerThread("background-1") {
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
// 子线程,且只会调用一次
Log.i(TAG, "onLooperPrepared..."+Thread.currentThread().getName());
}
};
background.start();
backHandler = new Handler(background.getLooper()) {
@Override
public void handleMessage(Message msg) {
// 子线程
Log.d(TAG, Thread.currentThread().getName() + "handlerMessage==" + msg.what);
}
};
}
@Override
protected void onDestroy() {
super.onDestroy();
background.quit(); // quit() 方法最好调用。这是让释放资源的。比如内部持有的`Message`对象。
}
该博客介绍了一个系统内部常用对象,其源码简单实用,简化了子线程使用。使用场景类似后台任务,无结果回调。它是某子类,核心方法可将对应对象取出调用。线程开启时回调特定方法,本质是开启线程创建对应对象,并给出使用示例。
4299

被折叠的 条评论
为什么被折叠?



