2013年4月8日 星期一

[Android] 分析This Handler class should be static or leaks

好文章,留著筆記:http://www.beyondcompare.cn/this-handler-class-should-be-static-or-leaks.html

重點擷取以下:

Handler作为Activity的内部类有可能会导致内存泄露的问题。
Handler类应该应该为static类型,否则有可能造成泄露。在程序消息队列中排队的消息保持了对目标Handler类的引用。如果Handler是个内部类,那么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。

package cn.beyondcompare.statichandlerdemo;

import java.lang.ref.WeakReference;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;

public class MainActivity extends Activity {

 MyHandler handler = new MyHandler(this);

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  test();
 }

 static class MyHandler extends Handler {

  WeakReference mActivity;

  MyHandler(MainActivity activity) {
   mActivity = new WeakReference(activity);
  }

  @Override
  public void handleMessage(Message msg) {
   MainActivity theActivity = (MainActivity) mActivity.get();
   switch (msg.what) {
   case 0:
    theActivity.test1();
    break;
   }
  }
 };

 private void test() {
  handler.sendEmptyMessage(0);
 }

 private void test1() {
 }
}

沒有留言:

張貼留言