zoukankan      html  css  js  c++  java
  • 内部类持有外部类引用,导致外部类无法被回收(android为例)

    原因:Handler在Android中用于消息的发送与异步处理,常常在Activity中作为一个匿名内部类来定义,此时Handler会 隐式地持有一个外部类对象(通常是一个Activity)的引用。当Activity已经被用户关闭时,由于Handler持有Activity的引用造成Activity无法被GC回收,这样容易造成内存泄露。
    正确的做法是将其定义成一个静态内部类(此时不会持有外部类对象的引用),在构造方法中传入Activity并对Activity对象增加一个弱引用,这样Activity被用户关闭之后,即便异步消息还未处理完毕,Activity也能够被GC回收,从而避免了内存泄露。
    public  static  class MyHandler  extends Handler {
             private WeakReference<Activity> reference;
            
             public MyHandler(Activity activity) {
                reference =  new WeakReference<Activity>(activity);
            }
    
            @Override
             public  void handleMessage(Message msg) {
                 if (reference.get() != null) {
                     switch (msg.what) {
                     case  0:
                         // do something...
                         break;
                     default:
                         // do something...
                         break;
                    }
                }
            }
        }
  • 相关阅读:
    HTML5中的audio在手机端和 微信端的自动播放
    vue框架
    购物车原理
    angular前端框架
    -webkit-line-clamp超过两行就出现省略号
    jQuery事件委托
    淘宝橱窗
    选字游戏
    大众点评订单分库分表实践
    业界难题-“跨库分页”的四种方案
  • 原文地址:https://www.cnblogs.com/sunupo/p/15508006.html
Copyright © 2011-2022 走看看