In Android, Handler classes should be static or leaks might occur, Messages enqueued on the application thread’s MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class
publicclassSampleActivityextendsActivity{privatefinalHandlermLeakyHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){// ...}}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);// Post a message and delay its execution for 10 minutes.mLeakyHandler.postDelayed(newRunnable(){@Overridepublicvoidrun(){/* ... */}},1000*60*10);// Go back to the previous Activity.finish();}}
publicclassSampleActivityextendsActivity{/** * Instances of static inner classes do not hold an implicit * reference to their outer class. */privatestaticclassMyHandlerextendsHandler{privatefinalWeakReference<SampleActivity>mActivity;publicMyHandler(SampleActivityactivity){mActivity=newWeakReference<SampleActivity>(activity);}@OverridepublicvoidhandleMessage(Messagemsg){SampleActivityactivity=mActivity.get();if(activity!=null){// ...}}}privatefinalMyHandlermHandler=newMyHandler(this);/** * Instances of anonymous classes do not hold an implicit * reference to their outer class when they are "static". */privatestaticfinalRunnablesRunnable=newRunnable(){@Overridepublicvoidrun(){/* ... */}};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);// Post a message and delay its execution for 10 minutes.mHandler.postDelayed(sRunnable,1000*60*10);// Go back to the previous Activity.finish();}}