Having a fragment, it has a listener which is registered in a global event manager and removed from it when the fragment is destroyed.
In the event listener it calls the fragment's member function foo(), which does some ui update.
So the fragment holds the listener as its member, and listener implicitly holds its container class - fragment. And the listener is temporarily held by event manager until removed from it.
The leak canary reports it is a leak, but the android studio's device monitor does not report it.
Seems this is very commonly used pattern, is it a leak? If it is what is better practice for case like this?
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;
}
};