Android中容易引起内存泄漏的地方

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来解决,谢谢。

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x