有一个片段,它有一个监听器,它在全局事件管理器中注册,并在片段被销毁时从中移除。
在事件监听器中,它调用片段的成员函数foo(),它会对某些ui进行更新。
因此片段将侦听器作为其成员,并且侦听器隐式保存其容器类 - 片段。并且监听器暂时由事件管理器保留,直到从中移除。
泄漏金丝雀报告它是泄漏,但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;
}
};
答案 0 :(得分:0)
根据您提供给我们的代码段,我们可以看到您正在进行清理的地方或可能正在调用dispose()
的内容。
您可以通过覆盖FooFragment类中的onDestroyView()
或onDetach()
之类的内容来确保对片段进行清理(假设它从未显示的Fragment类扩展上文)。