美文网首页
子线程直接 new 一个 Handler

子线程直接 new 一个 Handler

作者: 唐小鹏 | 来源:发表于2021-05-18 11:12 被阅读0次

可以在子线程直接 new 一个 Handler 吗?怎么做?

不可以,因为在主线程中,Activity 内部包含一个 Looper 对象,它会自动管理 Looper,处理子线程中发送过来的消息。而对于子线程而言,没有任何对象帮助我们维护 Looper 对象,所以需要我们自己手动维护。所以要在子线程开启 Handler 要先创建 Looper,并开启 Looper 循环

   new Thread(new Runnable(){
            @Override
             public void run() {
                 looper.prepare();
                 new Handler() {
                         @Override 
                         piblic void handlerMessage(Message msg) {
                             super,handleMessage(msg);
                         }
                 }
                 looper.loop();
            }
       }).start();

Handler 引起的内存泄露原因以及最佳解决方案

泄露原因:Handler 允许我们发送延时消息,如果在延时期间用户关闭了 Activity,那么该 Activity会泄露。 这个泄露是因为 Message会持有 Handler,而又因为 Java 的特性,内部类会持有外部类,使得 Activity 会被Handler 持有,这样最终就导致 Activity 泄露。
解决方案:将 Handler 定义成静态的内部类,在内部持有Activity 的弱引用,并在 Acitivity 的 onDestroy()中调用 handler.removeCallbacksAndMessages(null)及时移除所有消息。

相关文章

网友评论

      本文标题:子线程直接 new 一个 Handler

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