Android 匿名内部类造成的内存泄漏
来源:互联网 发布:数据恢复哪个软件好用 编辑:程序博客网 时间:2024/05/16 15:20
我们在写项目的时候,很容易在一个Actiivty下面利用如下代码:
private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { // do something } };
这样写很容易造成内存泄漏。因为匿名内部类handler是持有外面Activity的引用的,handler又是将message发送到消息队列中的,因此message就持有handler的引用。在消息队列中是按顺序被处理的,如有message正在等待消息队列处理它,此时Activity执行了finish,Activity不会被销毁的,因为message还没有做处理,handler不会被回收,Activity也不会被回收,那么就会内存泄漏。
遇到这种情况有二种解决内存泄漏的方法,
第一:
在Activity 的 onDestroy方法中执行 handler..removeCallbacksAndMessages(null);
将正在等待处理的meessage remove掉。
第二:
利用静态内部类不隐性持有外部类引用的特点,如下
private final Handler handler = new MyHandler(this); private static class MyHandler extends Handler{ private final WeakReference<xxxActivity> ref; public MyHandler(xxxActivity activity) { ref = new WeakReference<xxxActivity>(activity); } @Override public void handleMessage(Message msg) { if (ref == null) { return; } xxxActivity activity = ref.get(); //acitivity被回收 if (activity==null) { return; } // next ... } }此时,如果静态内部类需要用到外面的类,那么让handler持有一个弱引用的activity,这样就不会造成内存泄漏。
总结:
a 匿名内部类、非静态内部类都会隐性持有外部类引用,而静态内部类和匿名类的静态实例是不会持有外部类引用的。
b 遇到生命周期比activity长的情形,内存泄漏一定是个隐患。
c 尽量新建一个文件定义类亦或者利用弱引用拿到外部类引用。
阅读全文
0 0
- 匿名内部类造成的内存泄漏
- Android 匿名内部类造成的内存泄漏
- 匿名内部类持外部引用造成内存泄漏问题
- 匿名内部类持外部引用造成内存泄漏问题
- Android内存泄漏(非静态内部类创建静态实例造成的内存泄漏)
- 非静态内部类造成的内存泄漏
- 怎么使Handler净身出户(非静态内部类和匿名内部类造成内存泄漏)
- Android 非静态内部类/匿名类引起的内存泄漏
- 关于匿名内部类,非静态内部类会造成内存泄露的隐患。
- 非静态内部类创建静态实例造成的内存泄漏
- Android减少内存泄漏之静态内部类的使用
- android-内部类导致的内存泄漏实战解析
- 为何Android使用非静态内部类容易造成的泄漏!
- 内部类导致内存泄漏的情况
- Android中随处可见的匿名内部类
- android button 匿名内部类的理解
- Android里面的匿名类与匿名内部类使用
- Android里面的匿名类与匿名内部类使用
- 项目中的错误
- MySQL 中间件
- 解决问题的基本技巧
- 常用开源框架使用
- Linux安装ftp组件(8步完成)
- Android 匿名内部类造成的内存泄漏
- windows平台安装mysql5.7解压缩版本
- 浅谈PID
- VCL组件之Button
- Git & Gitlab 使用指南
- OsmocomBB 代码分析(2)
- Android音视频API(android.media):概览
- 通过非数字和字符的方式实现PHP WebShell
- sublime 安装插件