问题说明
在封装工具类时经常需要让其他对象持有 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 虚拟机就会把这个弱引用加入到与之关联的引用队列中。