protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
textView = (TextView) findViewById(R.id.text);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
textView.setText(String.valueOf(timer++));
handler.postDelayed(this, 1000);
}
});
}
以上这种情况会很容易发生内存泄漏,因为在你的Activity在回收的时候Handler发出的延时请求在不停的运行所以Activity就会被Handler继续占有所以Activity就会造成内存泄漏。
如何解决这个问题呢?
其实很简单,我们只要在Activity的不用的时候也就是销毁的时候将Handelr的调用全部取消掉,代码如下
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
textView = (TextView) findViewById(R.id.text);
handler.post(new Runnable() {
@Override
public void run() {
textView.setText(String.valueOf(timer++));
if (handler != null) {
handler.postDelayed(this, 1000);
}
}
});
}
private Handler handler = new Handler();
@Override
protected void onDestroy() {
super.onDestroy();
// 避免Handler导致内存泄漏
handler.removeCallbacksAndMessages(null);
handler = null;
}
还有一种情况就是在Activity中使用Handler在handler的执行主体内也就是大括号内用到了this.调用的时候有可能会造成Activity的泄漏,具体代码例子我就不写了,我要告诉大家这种情况避免需要我们使用WeakReference来解决,谢谢。