美文网首页
组件封装时对Activity和Service之类具有生命周期的C

组件封装时对Activity和Service之类具有生命周期的C

作者: kongzue | 来源:发表于2019-06-17 15:57 被阅读0次

问题说明

在封装工具类时经常需要让其他对象持有 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

相关文章

网友评论

      本文标题:组件封装时对Activity和Service之类具有生命周期的C

      本文链接:https://www.haomeiwen.com/subject/fnnafctx.html