android中使用Handler进行线程间通讯和消息的异步处理,在定义Handler时,有多种不同方式,常用的如

Handler handler = new Handler(){...}

这种写法存在内存泄漏风险,因为handler会持有匿名对象的引用,匿名对象会持有外部类对象的引用,且handler的生命周期较为特殊,并不会随activity(或fragment)结束而结束,所以,如果activity结束了,但是你的handler还存在未处理完的消息,其生命还在,这时候handler会阻止activity的回收,则会引起内存泄漏等不可控风险。

正确做法有两种:

1.静态内部类实现,这是最标准的写法。

 

private MyHandler handler = new MyHandler(this);static class MyHandler extends Handler {        WeakReference weakReference;        public MyHandler(SecondActivity activity) {            weakReference = new WeakReference(activity);        }         @Override        public void handleMessage(Message msg) {                    }    }

对外部类进行弱引用,GC时此引用可被自动回收。

2.使用Handler.Callback接口

private Handler mHandler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            return false;        }    });

此方法需要在onDestroy方法中调用handler.removeCallbacksAndMessages(null); 来清空消息。或者加入用弱引用

Handler handler = new Handler(new WeakReference(new Handler.Callback(    @overridepublic     boolean handleMessage(Message msg) {    })).get());

这样在堆中匿名对象只有指向它的弱引用,gc回收可以回收它。

参考:https://blog.csdn.net/try_zp_catch/article/details/78900031

           https://www.jianshu.com/p/41abcdd72bda

           https://blog.csdn.net/androidsj/article/details/79865091

更多相关文章

  1. Android(安卓)event日志打印原理
  2. Andriod学习笔记(二)
  3. DDPush开源推送框架源码分析之APPServer到DDPush
  4. Android(安卓)Glide 基于4.8.0的源码分析
  5. android中将复杂json对象进行数据转换
  6. 探索Android中的Parcel机制(上)
  7. Android如何播放GIF动画
  8. [置顶] Android(安卓)WebKit消息处理
  9. android客户端xmpp & smack & openfire简单开发实例

随机推荐

  1. openssl加密
  2. Matrix详解_Matrix怎么用
  3. Android(安卓)studio使用adbwireless实现
  4. Android(安卓)UI开发第十三篇——android
  5. 在Android中利用iText生成PDF
  6. android应用基础--由官方帮助文件翻译
  7. camp
  8. 9.1、Android中得到新打开Activity 关闭
  9. Android修炼之道——GreenDroid 架构工具
  10. Android程序的签名保护及绕过方法