HandlerThread 的官方解释:
/**
* 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类是一个线程专门处理Hanlder的消息,依次从Handler的队列中获取信息,逐个进行处理,保证安全,不会出现混乱引发的异常。HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。
使用方法:
public class DemoActivity extends Activity {
private HandlerThread handlerThread;
private ImageView imageView, imageView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
initial();
}
private void initial() {
imageView = (ImageView) findViewById(R.id.image1);
imageView1 = (ImageView) findViewById(R.id.image2);
handlerThread = new HandlerThread("DemoActivity");
handlerThread.start();
final Handler handler = new Handler(handlerThread.getLooper());
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handler.post(new MyRunnable(1));
handler.post(new MyRunnable(2));
}
});
}
class MyRunnable implements Runnable {
int pos;
public MyRunnable(int pos) {
this.pos = pos;
}
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (pos == 1) {
imageView.post(new Runnable() {
public void run() {
imageView.setBackgroundResource(R.drawable.ic_launcher);
}
});
} else {
imageView.post(new Runnable() {
public void run() {
imageView1.setBackgroundResource(R.drawable.ic_launcher);
}
});
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
handlerThread.quit();
}
}
HandlerThread适合在只需要在一个工作线程(非UI线程)+任务的等待队列的形式,优点是不会有堵塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理。处理效率较低。