Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.
翻译:
HandlerThread能够新建拥有Looper的线程。这个Looper能够用来新建其他的Handler。(线程中的Looper)需要注意的是,新建的时候需要被回调。
private HandlerThread handlerThread;
private Handler handler;
......
handlerThread = new HandlerThread("handlerthread");
handlerThread.start();
handler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
LogUtil.print("handle,消息" + msg.what + Thread.currentThread().getName());
switch (msg.what) {
//可执行耗时操作
..........
..........
}
}
};
//在主线程给handle发送消息
final Message message =new Message();
message.what=1;
handler.sendMessage(message);
new Thread(new Runnable() {
@Override
public void run() {
Message message1 = new Message();
message1.what = 2;
handler.sendMessage(message1);
}
}).start();
........
@Override
protected void onDestroy()
{
super.onDestroy();
//释放资源
mHandlerThread.quit();
}
HandlerThread的特点
HandlerThread将loop转到子线程中处理,说白了就是将分担MainLooper的工作量,降低了主线程的压力,使主界面更流畅。
开启一个线程起到多个线程的作用。处理任务是串行执行,按消息发送顺序进行处理。HandlerThread本质是一个线程,在线程内部,代码是串行处理的。
但是由于每一个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。
HandlerThread拥有自己的消息队列,它不会干扰或阻塞UI线程。
对于网络IO操作,HandlerThread并不适合,因为它只有一个线程,还得排队一个一个等着。