拥有一个片段,它有一个侦听器,该侦听器在全局事件管理器中注册,并在片段被销毁时从其中删除。
在事件监听器中,它调用片段的成员函数 foo(),它会进行一些 ui 更新。
所以fragment把listener作为它的成员,listener隐式的持有它的容器类——fragment。并且侦听器暂时由事件管理器持有,直到从中删除。
泄漏金丝雀报告它是泄漏,但 android studio 的设备监视器没有报告它。
看起来这是很常用的模式,是不是泄漏了?如果是这样的情况更好的做法是什么?
class FooFragment {
public FooFragment() {
Globals.EventManager.addEventListener(mDataReadyLoadedEventListener);
}
public void dispose() {
Globals.EventManager.removeEventListener(mDataReadyLoadedEventListener);
mDataReadyLoadedEventListener = null;
}
... ...
void foo();
EventListener<DataReadyLoadedEvent> mDataReadyLoadedEventListener = new EventListener<DataReadyLoadedEvent>(
DataReadyLoadedEvent.class) {
@Override
public boolean onEvent(DataReadyLoadedEvent event) {
foo();
return false;
}
};