美文网首页
HandlerThread

HandlerThread

作者: 纳兰沫 | 来源:发表于2021-07-05 13:32 被阅读0次

    HandlerThread本质上是通过继承Thread类和封装Handler类的使用,从而使得创建新线程和其他线程进行通信变得更加方便易用

    1.工作原理

    内部原理 = Thread类 + Handler类机制
    通过继承Thread类 快速的创建一个带有Looper对象的新工作线程
    通过封装Handler类 快速的创建Handler与其他线程进行通信

            HandlerThread handlerThread = new HandlerThread("handlerThread");
            //启动线程
            handlerThread.start();
            //创建工作线程和复写handleMessage
            //关联HandlerThread的Looper对象  实现消息处理操作与其他线程进行通信
            //消息处理操作的(handleMessage) 的执行线程 = handlerThread所创建的工作线程中执行
            Handler workHandler = new Handler( handlerThread.getLooper()) {
                @Override
                public void handleMessage(@NonNull Message msg) {
                    //消息处理
                    super.handleMessage(msg);
                }
            };
            //使用工作线程Handler向工作线程的消息队列发送消息
            Message msg = Message.obtain();
            msg.what = 2;
            msg.obj = "B";
            //通过Handler发送消息到其绑定的消息队列
            workHandler.sendMessage(msg);
            //结束线程 即停止线程的消息循环
            handlerThread.quit();
    

    当连续执行事件时,发现是按照顺序一个个执行,是因为使用HandlerThread时只是开了一个工作线程,多次执行事件,只是将消息发送到消息队列,等到派发消息给Handler再进行对应的操作

    2.Handler内存泄露

    2.1原因

    1.存在"未被处理/正处理的消息" -> Handler实例 -> 外部类的引用关系
    2.当Handler消息队列还有未处理的消息或正在处理消息时,而外部类需销毁,就会使得外部类无法被垃圾回收器(GC)回收,从而造成内存泄露

    2.2 解决方案

    a.静态内部类 + 弱引用

     private  static class FHandler extends Handler {
            private WeakReference<Activity> reference;
    
            //在构造方法中传入需要持有的Activity实例
            public FHandler(Activity activity) {
                reference = new WeakReference<Activity>(activity);
            }
    
            @Override
            public void handleMessage(@NonNull Message msg) {
                switch (msg.what) {
                    case 1:
                        break;
                    default:
                        break;
                }
            }
      }
    

    b.当外部类结束生命周期时,清空Handler内消息队列

       @Override
        protected void onDestroy() {
            super.onDestroy();
            mHandler.removeCallbacksAndMessages(null);
            // 外部类Activity生命周期结束时,同时清空消息队列 & 结束Handler生命周期
        }
    

    为了保证Handler中消息队列中的所有消息都能被执行,此处推荐使用解决方案1解决内存泄露问题,即 静态内部类 + 弱引用的方式

    相关文章

      网友评论

          本文标题:HandlerThread

          本文链接:https://www.haomeiwen.com/subject/orieultx.html