HandlerThread最大的优势在于引入MessageQueue概念,可以进行多任务队列管理。
HandlerThread背后只有一个线程,所以任务是串行依次执行的。串行相对于并行来说更安全,各任务之间不会存在多线程安全问题。
HandlerThread所产生的线程会一直存活,Looper会在该线程中持续的检查MessageQueue,并开启消息处理的循环。这一点和Thread(),AsyncTask都不同,thread实例的重用可以避免线程相关的对象的频繁重建和销毁。 getLooper().quit();来退出这个线程,其实原理很简单,就是改变在消息循环里面标志位,退出整个while循环,使线程执行完毕。
部分 测试代码如下:
public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- tv_name = (TextView) findViewById(R.id.tv_name);
- btn_name = (Button) findViewById(R.id.btn_name);
- Log.i(TAG, "==================main thread:" + Thread.currentThread().getName());
- final HandlerThread mHandlerThread = new HandlerThread("handlerThread");
- mHandlerThread.start();
- // Handler的handlerMessage方法在主线程执行还是在子线程执行,取决于创建Handler时传递给Handler的looper
- final MyHandler mHanlder = new MyHandler(mHandlerThread.getLooper());
- btn_name.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- mHanlder.sendEmptyMessage(1);
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- mHandlerThread.getLooper().quit();
- }
- });
- }
- class MyHandler extends Handler {
- public MyHandler(Looper looper) {
- super(looper);
- }
- @Override
- public void handleMessage(Message msg) {
- Log.i(TAG, "==================" + Thread.currentThread().getName());
- // 输出内容为: ==============handlerThread
- //tv_name.setText("hello, this is the first message from handler");
- super.handleMessage(msg);
- }
- }
不过要注意:要想更新界面内容,还是需要使用主线程的Looper,不然的话还是会抛错误。