問題說明
在封裝工具類時經常需要讓其他對象持有 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 虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。