组件封装时对Activity和Service之类具有生命周期的Context防止内存泄漏的处理

问题说明

在封装工具类时经常需要让其他对象持有 Activity和Service之类具有生命周期的 Context,但这也就会造成内训泄漏问题。

所谓内存泄漏,就是指当具有生命周期的类,诸如 Activity和Service在结束其生命周期后,由于其句柄依然被其他类持有导致系统无法回收资源的问题。

要解决此问题,就需要增加额外的释放方法,或者中断句柄关联关系。

解决方案1

在封装类中对持有的Context提供释放方法,例如:

class A{
    private Context c;

    public void init(Context c){
        this.c = c;
    }

    public void recycle(){
        c = null;
    }
}

并在 Activity、Service 的 onDestroy() 中执行 a.recycle() 方法。

解决方案2

使用弱引用:

class A{
    private WeakReference<Context> c;

    public void init(Context c){
        this.c = new WeakReference<>(c);
    }

    public Context getC(){
        return c.get();
    }
}

使用 WeakReference.get() 来获取使用 Context 对象。

具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列联合使用,如果弱引用所引用的对象被垃圾回收,Java 虚拟机就会把这个弱引用加入到与之关联的引用队列中。

参考文章

https://juejin.im/post/5cf152b2f265da1bd522b634

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,650评论 0 8
  • 基础 JAVA是在JVM所虚拟出的内存环境中运行的,内存分为三个区:堆、栈和方法区。 栈(stack):是简单的数...
    yujunjun阅读 20,819评论 0 27
  • 【Android 内存泄漏】 引用: ★★★ 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟...
    Rtia阅读 861评论 0 2
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 2,399评论 0 12
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    apkcore阅读 1,237评论 2 7