先来看一段代码:
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