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. 【转】话说C语言const用法

    原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...

  2. PHP异常处理机制

    1. 异常: 异常(Exception)用于在指定的错误发生时改变脚本的正常流程. 当异常被触发时,通常会发生: (1)当前代码状态被保存: (2)代码执行被切换到预定义的异常处理器函数: (3)根据 ...

  3. runtime--小白看过来

    目录 RunTime 概述 RunTime消息机制 RunTime交换方法 RunTime消息转发 RunTime关联对象 RunTime实现字典与模型互转 1.RunTime 概述 我们在面试的时候 ...

  4. Game

    Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  5. 2016 湖南省省赛 Problem A: 2016

    Problem A: 2016 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 296  Solved: 171 Description  给出正整数 n ...

  6. Windows下caffe的python接口配置

    主要是因为,发现很多代码是用python编写的,在这里使用的python安装包是anaconda2. 对应下载地址为: https://www.continuum.io/downloads/ 安装py ...

  7. mybatis映射异常

    今天写项目突然遇到了这么个问题:  nested exception is org.apache.ibatis.reflection.ReflectionException: There is no  ...

  8. 4. ZooKeeper 基本操作

    ZooKeeper的数据模型及其API支持以下九个基本操作: 操作 描述 create 在ZooKeeper命名空间的指定路径中创建一个znode delete 从ZooKeeper命名空间的指定路径 ...

  9. TF30042: The database is full. Contact your Team Foundation Server administrator.

    TF30042: The database is full. Contact your Team Foundation Server administrator. 在一个阳光明媚的下午,迁入代码的时候 ...

  10. 使用duilib开发简单的Window安装包

    一.具体思路 安装过程:安装包的制作包括资源文件的打包,资源文件打包到安装包exe中,安装的时候需要从exe中提取出对应的资源文件, 然后解压文件安装到指定目录,然后就是对安装的可执行程序进行注册表的 ...