Android -- Handler引起的内存泄露及解决办法

来源:互联网 发布:vb和java哪个好 编辑:程序博客网 时间:2024/05/16 00:51

       用Lint分析时,若使用内部类创建handler,会报内存泄露的问题。造成内存泄露的原因是message和activity的生命周期不一样,当acticvity销毁的时候,message还在消息队列中,导致GC无法进行垃圾回收。

private Handler mHandler = new Handler() {    public void handleMessage(Message msg) {        super.handleMessage(msg);        switch (msg.what) {                //do something ...        }    }}

     以下两种方法可以解决handler引起的内存泄露:

     1.用静态类声明Handler,并且用弱引用来引用activity

代码如下:

  private static class MyHandler extends Handler {    private final WeakReference mActivity;    public MyHandler(SampleActivity activity) {      mActivity = new WeakReference(activity);    }    @Override    public void handleMessage(Message msg) {      SampleActivity activity = mActivity.get();      if (activity != null) {        // do something...      }    }

PS:在Java 中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用,静态的内部类不会持有外部类的引用。


     2.在onPause或onDestroy中释放message和callbacks

添加如下代码:

mHandler.removeCallbacksAndMessages(null);




0 0