将这种模式作为泄漏的来源

时间:2016-11-02 19:56:01

标签: android memory-leaks leakcanary

有一个片段,它有一个监听器,它在全局事件管理器中注册,并在片段被销毁时从中移除。

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

1 个答案:

答案 0 :(得分:0)

根据您提供给我们的代码段,我们可以看到您正在进行清理的地方或可能正在调用dispose()的内容。

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