假设以下两个类:
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实现有什么问题吗?
答案 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。这样他们就不会被垃圾收集。