如何防止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);
- 释放:
@Override protected void onDestroy() { super.onDestroy(); ... FixedThreadPoolManager.release(); handler.clear(); handler.removeCallbacksAndMessages(null); }
而编译器里就可以看到WeakReference的父级抽象类Reference对clear()的处理:
public void clear() { this.referent = null; }
那么,只要系统执行了GC,这个WeakReference对象持有的引用就会被释放,也就不会造成内存泄漏了。
阅读全文