0

拥有一个片段,它有一个侦听器,该侦听器在全局事件管理器中注册,并在片段被销毁时从其中删除。

在事件监听器中,它调用片段的成员函数 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;
    }
};
4

1 回答 1

0

鉴于您提供给我们的代码片段,我们可以看到您在哪里进行清理或可能在调用什么dispose()

onDestroyView()您可以通过覆盖类似或在 FooFragment 类中的内容来确保在片段上进行清理onDetach()(假设它从上面未显示的Fragment类扩展)。

于 2016-11-02T22:01:20.067 回答