Anonymous callback in activities
suggest changeEvery Time you create an anonymous class, it retains an implicit reference to its parent class. So when you write:
public class LeakyActivity extends Activity { ... foo.registerCallback(new BarCallback() { @Override public void onBar() { // do something } }); }
You are in fact sending a reference to your LeakyActivity instance to foo. When the user navigates away from your LeakyActivity, this reference can prevent the LeakyActivity instance from being garbage collected. This is a serious leak as activities hold a reference to their entire view hierarchy and are therefore rather large objects in memory.
How to avoid this leak:
You can of course avoid using anonymous callbacks in activities entirely. You can also unregister all of your callbacks with respect to the activity lifecycle. like so:
public class NonLeakyActivity extends Activity { private final BarCallback mBarCallback = new BarCallback() { @Override public void onBar() { // do something } }); @Override protected void onResume() { super.onResume(); foo.registerCallback(mBarCallback); } @Override protected void onPause() { super.onPause(); foo.unregisterCallback(mBarCallback); } }
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents