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();}}
在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。123456789public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() {