使用弱引用侦听器的java
假设如下:
public interface Listener {
public void onListen();
}
public class ActionClass {
WeakReference<Listener> listener = null;
public void doAction(String action, Listener listener) {
this.listener = new WeakReference<Listener>(listener);
doTheAction(action);
}
public void actionComplete() {
if (listener != null && listener.get() != null)
listener.onListen();
}
}
public class AnotherClass {
ActionClass actioner = new ActionClass();
void init() {
actioner.doAction("something", new Listener() {
onListened() {
Log.d("Tag", "Action complete!");
}
};
}
}
抱歉,如果有拼写错误/语法错误,这更应该是伪代码
无论如何,很多时候,当“Action”完成时,对listener的WeakReference将被GCed,即使“AnotherClass”的实例仍然存在。有没有办法避免这种情况
# 1 楼答案
顺便说一句,你的代码中有一个bug,而不是一个答案:
这段代码包含一个竞争条件,因为GC可以在您检查它的
null
时间和您调用它的时间之间获取引用。您需要将其替换为以下内容:这通过在局部变量中有一个引用来保持任何侦听器的活动
此外,您应该知道,GC可能会比您的
AnotherClass
存活的时间长得多,因为无法保证它何时会收获,但我想您知道这一点