0

假设以下两个类:

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) {
    }
}

一旦用户转到另一个 Activity,这两个 Activity 中的任何一个都会泄漏吗?是否会阻止任何一个 Activity 获得 GCed?上面的 Listener 实现有什么问题吗?

4

1 回答 1

1

你的例子有一些错误。

例如,您从不实例化 Network 并且每次实例化它时,静态字段都会引用另一个实例。编写网络的更合适的方法如下

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

    private Network() {/*empty*/}

    public static Network get() {
        return INSTANCE;
    }

    //rest of the code ommitted
}

但是,如果您没有从 Network 单例中删除 Activity 实例(网络类中的静态字段实例 - 假设您在某个时候对其进行了初始化),那么该实例将始终具有对添加到它的 Activity 对象的引用数组列表。这样他们就不能被垃圾收集。

于 2013-07-09T18:44:22.120 回答