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;
                    }
                }
            }
        }
  • 相关阅读:
    1052 卖个萌 (20 分)
    1046 划拳 (15 分)
    1051 复数乘法 (15 分)
    1042 字符统计 (20 分)哈希
    1041 考试座位号 (15 分)哈希
    1061 判断题 (15 分)
    1093 字符串A+B (20 分)简单哈希
    Hibernate框架
    SVN的安装与介绍
    easyUI的简单操作
  • 原文地址:https://www.cnblogs.com/sunupo/p/15508006.html
Copyright © 2011-2022 走看看