如何防止activity的双重引用和Handler等造成内存泄漏

来源:互联网 发布:淘宝客推广个多少钱 编辑:程序博客网 时间:2024/06/08 06:22

  今天说一下作为新手的我们经常犯的错—-以activity等作为参数造成双重引用而产生的内存泄漏,这在DDMS、Findbugs等一些插件里是可以检测到的。
  而Android studio总是会提示你Handler建议使用static,很多人应该都见过。使用static(类变量)确实能够保证当前activity是”单例”且不持有外部引用,但造成的麻烦是,static的类中不能使用实例变量。而一般情况下MainActivity(主界面)都会持有一些实例变量,且仍然存在双重引用。
  相信使接触过Camera、大量图片处理(一般用软引用)以及其他必须手动去释放资源工具的同学应该清除弱引用WeakReference(弱引用),它能保证即使程序异常退出的情况下仍然能够释放资源,且不需要手动去管理的工具类了。只要被包裹的对象为null关键字或不再被引用时,就会由系统管理释放。
  下面以Handler为例,粗略看一下普遍防止内存泄漏的做法:
  
1. 在Activity中声明Handler类并懒汉初始化Handler:

private class MainHandler extends Handler {        private final WeakReference<Activity> mActivity;        public MainHandler(Activity activity) {            mActivity = new WeakReference<Activity>(activity);        }        public void clear(){            if(null != mActivity) {                mActivity.clear();            }        }        @Override        public void handleMessage(Message msg) {            // TODO Auto-generated method stub            if(null == mActivity.get()){                return;            }            switch (msg.what) {                case Constants.APP_EXIT:                    addActivity(Activity.this);                    exit();                    break;                    ...            }         }      };  MainHandler handler = new MainHandler(this);  
  1. 释放:
@Override    protected void onDestroy() {        super.onDestroy();        ...        FixedThreadPoolManager.release();        handler.clear();        handler.removeCallbacksAndMessages(null);    }

而编译器里就可以看到WeakReference的父级抽象类Reference对clear()的处理:

    public void clear() {        this.referent = null;    }

那么,只要系统执行了GC,这个WeakReference对象持有的引用就会被释放,也就不会造成内存泄漏了。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 三大本是什么 本科教学评估 快了大本营 本科和专科 本科提前批什么意思 高等职业本科 套读本科 怏乐大本营 自考专科本科 大专学费一般多少 本科英语 本科学校有哪些 大本营 本科补录 本科学院 快乐大 全日制专科是什么意思 本科 英文 什么是本科生 3+4本科 怀旧服法师三大本毕业装备 怀旧服猎人三大本毕业装备 魔兽怀旧服三大本 怀旧服术士三大本毕业装备 怀旧服盗贼三大本毕业装备 魔兽怀旧法师三大本毕业装备 魔兽世界怀旧服三大本 海岛奇兵教你20分钟升大本 大朴 大朴网 大朴家纺 大来 大林和小林 大林小林 大林 大林美育 大林小林读后感 大林和小林读后感 大林和小林好词好句 大林小林好词好句 大林和小林读后感50字