Имея фрагмент, он имеет прослушиватель, который зарегистрирован в глобальном диспетчере событий и удален из него, когда фрагмент уничтожен.будет этот образец источником утечки
В случае прослушивателя он вызывает функцию члена 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;
}
};
Спасибо Numan! фрагмент не отображает все детали, объект dispose предназначен для вызова в OnDestroyView() фрагмента. – lannyf