监听器的垃圾收集澄清(Java / Android)

时间:2013-07-09 16:00:36

标签: java android memory-leaks garbage-collection

假设以下两个类:

public class Network {
   private static Network instance;
   public Network() {
      instance = this;
   }
   public static Network getInstance() {
      return instance;
   } 
   public interface Listener {
       public void event(String msg);
   };
   ArrayList<Listener> listeners = new ArrayList<Listener>();

   public void addListener(Listener listener) {
        listeners.add(listener);
   }


}


public class Act1 extends Activity implements Network.Listener {
    @Override
    public void onCreate(Bundle b) {
        Network.getInstance().addListener(this);
    }
    public void event(String msg) {
       // do nothing
    }
}

public class Act2 extends Activity implements Network.Listener {
    @Override
    public void onCreate(Bundle b) {
          Network.getInstance().addListener(new Network.Listener() {
     public void event(String msg) {
      // do nothing
        }
    );
    }
    public void event(String msg) {
    }
}

一旦用户转移到另一个活动,其中一个活动是否会泄漏?是否会阻止任何活动获得GC?上面的Listener实现有什么问题吗?

1 个答案:

答案 0 :(得分:1)

你的例子有一些错误。

例如,您永远不会实例化网络,每次实例化它时,静态字段都将引用另一个实例。编写网络的更合适的方法是以下

public class Network {
    private static final Network INSTANCE = new Network();

    private Network() {/*empty*/}

    public static Network get() {
        return INSTANCE;
    }

    //rest of the code ommitted
}

但是,如果您没有从网络单例(网络类中的静态字段实例 - 假设您在某个时刻初始化它)中删除活动实例,那么该实例将始终具有对您的活动对象的引用添加到它的ArrayList。这样他们就不会被垃圾收集。