HandlerThread本质上就是一个普通Thread,只是这个线程内部有一个looper,而这个looper有一个消息队列MessageQue,它通过不断的用looper去检查MessageQue然后取出消息然后处理。
基本用法
创建一个HandlerThread
mThread = new HandlerThread("handler_thread");
启动一个HandlerThread
mThread.start();
示例
方式一
public class MainActivity extends AppCompatActivity {
private HandlerThread myHandlerThread ;
private Handler handler ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建一个线程,线程名字:handler-thread
myHandlerThread = new HandlerThread( "handler-thread") ;
//开启一个线程
myHandlerThread.start();
//在这个线程中创建一个handler对象
handler = new Handler( myHandlerThread.getLooper() ){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//这个方法是运行在 handler-thread 线程中的 ,可以执行耗时操作
Log.d( "handler " , "消息: " + msg.what + " 线程: " + Thread.currentThread().getName() ) ;
}
};
//在主线程给handler发送消息
handler.sendEmptyMessage( 1 ) ;
new Thread(new Runnable() {
@Override
public void run() {
//在子线程给handler发送数据
handler.sendEmptyMessage( 2 ) ;
}
}).start() ;
}
@Override
protected void onDestroy() {
super.onDestroy();
//释放资源
myHandlerThread.quit() ;
}
}
运行效果:
/com.app D/handler: 消息: 1 线程: handler-thread
/com.app D/handler: 消息: 2 线程: handler-thread
方式二
首先继承了HandlerThread,并实现了 Handler.Callback的接口
private class MyHandlerThread extends HandlerThread implements Handler.Callback {
public MyHandlerThread(String name) {
super(name);
}
@Override
public boolean handleMessage(Message msg) {
System.out.println("handleMessage CurrentThread=" + Thread.currentThread().getName());
handlerUi.sendEmptyMessage(i);
i++;
return false;
}
}
初始化该handlerThread并启动
handlerThread = new MyHandlerThread("myHandler");
handlerThread.start();
Ui线程获取能给HandlerThread发消息的Handler
handler = new Handler(handlerThread.getLooper(), handlerThread);
使用场景
HandlerThread 的使用场景
HandlerThread 所做的就是在新开的子线程中创建了 Looper,那它的使用场景就是 Thread + Looper 使用场景的结合,即:在子线程中执行耗时的、可能有多个任务的操作。
比如:多个下载任务 具体实例可参考链接:http://blog.csdn.net/u011240877/article/details/72905631
HandlerThread的特点
-
HandlerThread将loop转到子线程中处理,说白了就是将分担MainLooper的工作量,降低了主线程的压力,使主界面更流畅。
-
开启一个线程起到多个线程的作用。处理任务是串行执行,按消息发送顺序进行处理。HandlerThread本质是一个线程,在线程内部,代码是串行处理的。
-
但是由于每一个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。
-
HandlerThread拥有自己的消息队列,它不会干扰或阻塞UI线程。
-
对于网络IO操作,HandlerThread并不适合,因为它只有一个线程,还得排队一个一个等着。
参考链接:
https://www.cnblogs.com/zhaoyanjun/p/6062880.html
http://blog.csdn.net/u014449046/article/details/51152701