2016-11-02 5 views
0

Имея фрагмент, он имеет прослушиватель, который зарегистрирован в глобальном диспетчере событий и удален из него, когда фрагмент уничтожен.будет этот образец источником утечки

В случае прослушивателя он вызывает функцию члена foo(), которая выполняет некоторое обновление ui.

Таким образом, фрагмент удерживает слушателя как его член, а слушатель неявно удерживает свой класс-фрагмент контейнера. А прослушиватель временно удерживается менеджером событий, пока не будет удален из него.

Утечка канарей сообщает, что это утечка, но монитор устройства студии Android не сообщает об этом.

Кажется, что это очень часто используемый шаблон, это утечка? Если это то, что лучше подходит для такого случая?

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

Учитывая фрагмент кода вы дали нам, что мы можем увидеть, где вы делаете вашу очистку или то, что может быть вызовом dispose().

Вы можете убедиться, что очистка происходит на фрагменте переопределяя что-то вроде onDestroyView() или onDetach() в классе FooFragment (предполагая, что она простирается от Fragment класса, который не показан выше).

+0

Спасибо Numan! фрагмент не отображает все детали, объект dispose предназначен для вызова в OnDestroyView() фрагмента. – lannyf