一、HandlerThread是什么
HandlerThread继承自Thread,它本质上就是一个Thread,而且专门用来处理Handler的消息
二、HandlerThread的使用方法
1.两种创建HandlerThread实例对象方法
HandlerThread handlerThread=new HandlerThread("TAG");
// 设置优先级
// HandlerThread handlerThread1=new HandlerThread("TAG",Process.THREAD_PRIORITY_DEFAULT);
一个参数是name,指的是线程的名称,另一个参数是priority,指的是线程优先级。线程的优先级的取值范围为-20到19。优先级高的获得的CPU资源更多,反之则越少。-20代表优先级最高,19最低。我们可以根据自己的需要去设置线程的优先级,也可以采用默认的优先级,HandlerThread的默认优先级是Process.THREAD_PRIORITY_DEFAULT,具体值为0
handlerThread.run();
3.通过Handler构建循环消息处理机制
Handler handler=new Handler(handlerThread.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
// TODO 处理子线程任务
return false;
}
});
handler.sendEmptyMessage(1);
这里要注意,在创建Handler作为HandlerThread线程消息执行者的时候必须先调用run()方法,因为创建Handler所需要的Looper参数是从HandlerThread中获得的,而Looper对象的赋值又是在HandlerThread的run()方法中创建。
三、HandlerThread机制原理
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
四、HandlerThread应用场景
HandlerThread比较适用于单线程+异步队列的场景,比如IO读写操作数据库、文件等,耗时不多而且也不会产生较大的阻塞。对于网络IO操作,HandlerThread并不适合,因为它只有一个线程,还得排队一个一个等着。
这里单线程+异步队列模型的使用场景还举几个例子:
- 应用刚启动时的数据初始化操作,如果开启多个线程同时执行,有可能争夺UI线程的CPU执行时间,造成卡顿,而使用该模型,通过设置优先级就可以将同步工作顺序的执行,而又不影响UI的初始化;
- 从数据库中读取数据展现在ListView中,通过Handler的postAtFrontOfQueue方法,快速将读取操作加入队列前端执行,必要时返回给主线程更新UI;
- HandlerThread应用在IntentService中,IntentService是一个需要长时间执行任务Service,优先级要比线程高。
网友评论