HandlerThread简介
HandlerThread是一个Android已封装好的轻量级的异步类。
HandlerThread 继承Thread,本质就是个Thread,与普通Thread 的区别在于实现了自己的Looper,可以单独分发和处理消息。
作用:
用来线程间的消息传递,主要是子线程和子线程间的通信,处理一些简单耗时的操作。
代码片段
public class TestMainActivity extends AppCompatActivity {
private String TAG = "Test_" + getClass().getSimpleName();
private HandlerThread mHandlerThread = null;
private Handler mThreadHandler = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate: ");
setContentView(R.layout.activity_main);
// 第一步
mHandlerThread = new HandlerThread(getClass().getSimpleName());
//第二步
mHandlerThread.start();
//第三步
mThreadHandler = new Handler(mHandlerThread.getLooper(), callback);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
//第四步
if (null != mThreadHandler) {
mThreadHandler.removeCallbacksAndMessages(null);
mThreadHandler = null;
}
if (null != mHandlerThread) {
//mHandlerThread.quitSafely();
mHandlerThread.quit();
mHandlerThread = null;
}
}
private Handler.Callback callback = new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
//可以处理耗时操作任务,IO操作就不建议了
//如果通知UI线程更新,可以使用UI线程的Handler或者runOnUiThread()
return false;
}
};
}
HandlerThread源码简介
第一步
HandlerThread变量的初始化
// 第一步 mHandlerThread = new HandlerThread(getClass().getSimpleName());
传入当前类名作为flag。
public class HandlerThread extends Thread {
int mPriority; //线程优先级
int mTid = -1;
Looper mLooper; //当前线程的Looper对象
private @Nullable Handler mHandler; // Handler对象
//只带有flag标签参数的构造函数
public HandlerThread(String name) {
super(name);
mPriority = Process.THREAD_PRIORITY_DEFAULT;
}
//带有flag标签和线程优先级参数的构造函数
public HandlerThread(String name, int priority) {
super(name);
mPriority = priority;
}
......
}
通过看源码,除了可以传入类名作为flag之外,还可以传入线程优先级。
第二步
HandlerThread的启动
//第二步 mHandlerThread.start();
为啥要先启动HandlerThread呢?我们看源码run()那部分。
protected void onLooperPrepared() {
}
@Override
public void run() {
mTid = Process.myTid();
//Looper的初始化,构建消息队列等
Looper.prepare();
synchronized (this) {
//获取当前线程的Looper对象
mLooper = Looper.myLooper();
//这里用synchronized锁住了,通过notifyAll通知锁住的对象
notifyAll();
}
//设置线程优先级
Process.setThreadPriority(mPriority);
//此方法是空的,作用是在线程循环是做一些初始化啥的
onLooperPrepared();
//使消息循环
Looper.loop();
//只有退出循环后才会执行到这里的。
mTid = -1;
}
从上面代码中看出,Looper是在HandlerThread的run()方法中初始化的。
第三步
//第三步 mThreadHandler = new Handler(mHandlerThread.getLooper(), callback);
获取HandlerThread中创建的Looper对象(上面run()方法中初始化的)
callback中用于消息的处理
第四步
//第四步
if (null != mThreadHandler) {
mThreadHandler.removeCallbacksAndMessages(null);
mThreadHandler = null;
}
if (null != mHandlerThread) {
//mHandlerThread.quitSafely();
mHandlerThread.quit();
mHandlerThread = null;
}
退出时,清空队列中的消息,退出HandlerThread。
参考文章
- 《(Android-HandlerThread使用及源码分析)[https://www.jianshu.com/p/884bfe380dba]》
- 《(Android HandlerThread)[https://www.jianshu.com/p/e4f202a9e83b]》
- 《Android源码HandlerThread.java》
![[摘]Android横屏和竖屏的方法](https://www.biumall.com/wp-content/themes/BiuX/assets/images/random/0.webp)