Handler内存泄漏问题

Android中使用Handler造成内存泄露

Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

当使用内部类创建Handler的时候,Handler对象会隐式持有外部类对象,通常Handler操作会伴随着一个耗时操作,当外包的Activity关闭时,被Handler引用的Activity并不会被立即回收而是被引用,导致Activity无法被销毁回收,从而导致内存泄漏。

内存泄露的危害

对于Android应用来说,就是你的用户打开一个Activity,使用完之后关闭它,内存泄露;又打开,又关闭,又泄露;几次之后,程序占用内存超过系统限制,导致OOM(内存溢出),程序出错。

解决

可以使用staticWeakReference 解决回收问题

  • 静态类不持有外部类的对象,所以你的Activity可以随意被回收
  • 弱引用对象就会在被GC检查到时回收掉
 static class MyHandler extends Handler {
     WeakReference<Activity> reference;

     public MyHandler(Activity activity) {
         reference = new WeakReference<>(activity);
     }

     @Override
     public void handleMessage(Message msg) {
         super.handleMessage(msg);
         Activity activity = reference.get();
         if (activity != null) {
             loadData();
         }
     }
 }

猜你喜欢

转载自blog.csdn.net/qq_14876133/article/details/81840492