android 多线程学习6:HandlerThread

android 多线程学习1:一些基础
android 多线程学习2:线程的创建与方法分析
android 多线程学习3:synchronized与volatile与线程安全对象
android 多线程学习4:线程池ThreadPoolExecutor
android 多线程学习5:AsyncTask
android 多线程学习6:HandlerThread
android 多线程学习7:Handler消息处理机制


HandlerThread使用

        //创建UI线程Handler
        final Handler mainHandler = new Handler();
        //创建HandlerThread实例
        HandlerThread handlerThread = new HandlerThread("HandlerThread1");
        //启动线程
        handlerThread.start();
        //创建工作线程Handler,关联HandlerThread的Looper对象,实现与其他线程进行通信
        Handler workHandler = new Handler(handlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case 888:
                        //子线程异步处理耗时操作(如查找文件)
                        File file = findFile();

                        //发送结果给主线程
                        Message resultMessage = new Message();
                        resultMessage.what = 999;
                        resultMessage.obj = file;
                        mainHandler.sendMessage(resultMessage);
                        break;
                    default:
                        break;
                }

            }
        };
        //发送指令给工作线程
        workHandler.sendEmptyMessage(888);



    private static class MyHandler extends Handler {

        private final WeakReference mActivty;

        public MyHandler(TestActivity activity) {
            mActivty = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (mActivty.get() != null) {
                if (msg.what == 999) {
                    //主线程更新UI操作
                    mActivty.get().refreshView(msg.obj);
                }
            }
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //退出消息循环
        handlerThread.quit();
        //清空消息队列
        workHandler.removeCallbacksAndMessages(null);
    }



HandlerThread分析

  1. HandlerThread 继承于Thread,所以本质上它就是一个线程;
  2. HandlerThread 内部集成了Looper实现,构建了Handler消息机制,可以让我们在自己的线程中分发和处理消息。


    HandlerThread中的Looper实现
  3. 单线程按照sendMessage的先后顺序执行多个任务;



HandlerThread使用场景

HandlerThread比较适用于单线程+异步队列的场景,比如IO读写操作,耗时不多而且也不会产生较大的阻塞。对于网络IO操作,HandlerThread并不适合,因为它只有一个线程,还得排队一个一个等着。



(部分内容参考于网络,如有不妥,请联系删除~)

你可能感兴趣的:(android 多线程学习6:HandlerThread)