Java虽然有垃圾回收,但是仍然存在内存泄露,比如静态变量、缓存或其他长生命周期的对象引用了其他对象,这些被引用的对象就会长期不能被GC释放,导致内存泄露。
弱引用(WeakReference)是解决这个问题的一种廉价方案,它不会阻止所引用的对象被GC,在需要的时候能够释放出内存。也因为这样,在每次访问弱引用中的对象时,必须检查对象是否为空(已被GC),算是一点点代价吧。
使用弱引用的几个小心得:
 
1,使用生命周期匹配的强引用避免弱引用。比如缓存需要一个Context引用,缓存是长生命周期的,在程序运行过程中会一直存在,如果使用Activity作为Context,因为Activity随时可能finish,生命周期与缓存不匹配,而如果使用Application作为Context,因为Application也是在程序运行中一直存在,周期是匹配的,就不会发生内存泄露,也就不需要弱引用。
2,配对引用和释放引用避免弱引用。在Activity的onResume中注册的回调可以在onPause的时候取消注册,可以避免对Activity的长期引用。
3,只能对非关键的变量使用弱引用。还是上面这个缓存的例子,Context是加载缓存数据必须的变量。如果使用弱引用,加载缓存的时候可能因为Context被GC而失败或者FC。
4,使用弱引用有时候也需要额外的清理。在一个缓存中,我们使用ArrayList保存了一些View的弱引用,这些View在不存在其他强引用的时候确实能够被GC,但是ArrayList的大小未变,仍然包含这些View已被GC的弱引用,弱引用自身反倒导致了内存泄露。
 
public class ViewCallback {
    private WeakReference<View> mViewReference;
  
    public ViewCallback(View view) {
        mViewReference = new WeakReference<View>(view);
    }
  
    public void show() {
        View view = mViewReference.get()
        if (view != null) {
            view.setVisibility(View.VISIBLE);
        }
    }
}

Android开发过程中使用弱引用解决内存泄露的习惯的更多相关文章

  1. Android开发过程中的坑及解决方法收录(四)

    1.某个控件要放在Linearlayout布局的底部(底部导航条) <LinearLayout xmlns:android="http://schemas.android.com/ap ...

  2. Android开发过程中的坑及解决方法收录(三)

    bug:应用出现了 不幸运的,应用已停止的错误提示 排除问题: 1.intent接收数据的字符串不匹配 2.java常见的NullPointerException(空指针错误),可能由三个原因引起,字 ...

  3. Android开发过程中的坑及解决方法收录(一)

    之前使用了Android Studio的插件直接为button绑定了监听器,并实现onClick方法(我的onClick方法无论点击哪一个都是要实现setcontentview这个方法设置layout ...

  4. Android开发过程中的坑及解决方法收录(二)

    bug 1: bug描述: 无法成功地将edittext中的内容传入数据库中 bug动图: 经过: 最近写了个项目,项目要使用到SQL数据库,由于没有相关知识,便是找到了各种资料开始了自学之旅,在de ...

  5. Android开发过程中的坑及解决方法收录(六)

    1. file.listFiles 空指针异常 最近在弄个小项目,类似一个文件管理器,需要获得手机存储里的目录之后显示,但是运行过程中出现错误,搜索了资料,得出了以下的解决办法 问题产生的原因: an ...

  6. Android开发过程中的坑及解决方法收录(五)

    1. 导入依赖库出现错误 因为使用的sdk版本不同,使用下列代码强制使用最低版本,25.3.1就是我当前使用的版本号,根据自己的情况修改 configurations.all { resolution ...

  7. Android开发过程中部分报错解决方法。

    初学Android,最近在使用zxing开发一个条码扫描解析的安卓项目中,遇到以下几个问题.贴出来以供参考. 1.Http请求错误    Android4.0以上要求不能把网络请求的操作放在主线程里操 ...

  8. 九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

    在<Effective Java 2nd Edition>中,第6条“消除过期的对象引用”提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象 ...

  9. Android学习笔记_78_ Android开发中使用软引用和弱引用防止内存溢出

    在<Effective Java 2nd Edition>中,第6条“消除过期的对象引用”提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象 ...

随机推荐

  1. Java Condition

    在Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll(),传统线程的通信方式,Condition都可以实现, ...

  2. Visual Studio插件Resharper 2016.1 及以上版本激活方法【亲测有效】

    1.破解补丁下载:https://flydoos.ctfile.com/fs/y80153828783.下载下来解压之后的文件如下: 2.打开文件夹“IntelliJIDEALicenseServer ...

  3. [JAVA第二课] java命名规则

    Java良好的命名规则以及代码风格可以看出来一个程序员的功底,好多公司也会注重这方面,他们招聘员工在有些时候往往就是根据一个人的代码风格来招人,所以下面就就我知道的代码风格作简要的说明一下.Java命 ...

  4. 【框架学习与探究之定时器--Hangfire】

    声明 本文欢迎转载,请注明文章原始出处:http://www.cnblogs.com/DjlNet/p/7603632.html 前言 在上篇文章当中我们知道关于Quartz.NET的一些情况,其实博 ...

  5. 自学Java HashMap源码

    自学Java HashMap源码 参考:http://zhangshixi.iteye.com/blog/672697 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提 ...

  6. IP核之初——FIFO添加以太网MAC头部

    本文设计思路源自明德扬至简设计法.在之前的几篇博文中,由于设计比较简单,所有的功能都是用verilogHDL代码编写实现的.我们要学会站在巨人的肩膀上,这时候就该IP核登场了! 说白了,IP核就是别人 ...

  7. mvc4 实现自己的权限验证 仿Authorize与AllowAnonymous原理

    参考文章 :http://www.cosdiv.com/page/M0/S878/878978.html 实现的效果:在控制器上(Controller)验证权限,在动作(Action)上不验证. 用M ...

  8. Problem X

    Problem Description Recently, iSea went to an ancient country. For such a long time, it was the most ...

  9. awk详解 数组

    第1章 awk命令基础 1.1 awk命令执行过程 1.如果BEGIN 区块存在,awk执行它指定的动作. 2.awk从输入文件中读取一行,称为一条输入记录.如果输入文件省略,将从标准输入读取 3.a ...

  10. Android 开发笔记___图像视图__简单截屏

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...