前言:要了解HandlerThread首先我们必须了解Handler消息机制,简单回顾一下Handler机制。大家都知道Handler是通过发送Messege到一个消息队列,然后通过Looper轮询器来取出消息然后处理。处理的方法就是handlerMessegeXXX(方法名大概就是这个)。那么这个处理方法执行的线程取决于什么呢?就是取决于Looper轮询器所在的线程。
本文不仅仅是教你如何使用HandlerThread,并且会告诉你为何要使用它,它的特殊之处在哪里?而不是简单的一个异步任务然后主线程更新UI这么简单。
好了进入正题,HandlerThread其实就是一个线程,只不过内部封装了Handler的相关消息处理机制,既然如此那么它首先就使用Looper.prepare();为自己创建了一个Looper,所以看了很多网上的文章都是把HandlerThread作为Asynctask来执行异步任务,主线程刷新的操作,其实这样根本就没必要使用HandlerThread。它真正强大的地方并不是说异步执行,主线程刷新,而是创建一个handlerThread可以执行多个任务。当然这个是有个前提的(我们后文会提到),假如我们有个需求:在子线程开启一个任务,这个任务有个回调也要在子线程执行(为什么会有这样的需求,因为如果回调过来的数据处理起来也是很耗时的,那么就不能在主线程执行)。请问大家会怎么去写:这里我写了一个使用Asynctask的例子,并且通过验证,回调会在主线程。当然我的例子是在前面提到的前提下执行的。
class MyTask extends AsyncTask<Void,Void,Void> implements Camera.PreviewCallback {
/**
* 需求:这里要在子线程执行
* @param voids
* @return
*/
@Override
protected Void doInBackground(Void... voids) {
Log.i("TAG",Thread.currentThread().getName()+"doInBackground..");