gpt4 book ai didi

java - 监听器垃圾收集说明(Java/Android)

转载 作者:行者123 更新时间:2023-12-01 14:21:08 25 4
gpt4 key购买 nike

假设有以下两个类:

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实现有什么问题吗?

最佳答案

您的示例有一些错误。

例如,您从未实例化 Network,每次实例化它时,静态字段都会引用另一个实例。编写 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
}

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

关于java - 监听器垃圾收集说明(Java/Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17552888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com