будет ли этот шаблон источником утечки

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

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

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

Канарейка сообщает об утечке, но монитор устройства 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 ответ

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

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