先来看一段代码:
public class MyActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { public void run() { doSomething(); } }); } void doSomething() { // Uses the activity instance } }
上面的代码会导致doSomething()方法在Activity因为一个configuration change导致 onDestroy() 方法被调用之后执行,使得activity对象无法及时释放
解决方案:
1.Handler的处理逻辑放到一个独立的class文件,并使用WeakReference引用activity,避免类似doSomething直接引用到activity的情景发生
2.onDestroy之前通过handler.removeCallbacks() 方法从消息队列移除这个消息
3.避免使用static Handler