組件封裝時對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,652評論 0 8
  • 基礎 JAVA是在JVM所虛擬出的內存環境中運行的,內存分為三個區:堆、棧和方法區。 棧(stack):是簡單的數...
    yujunjun閱讀 20,853評論 0 27
  • 【Android 內存泄漏】 引用: ★★★ 【知識必備】內存泄漏全解析,從此拒絕ANR,讓OOM遠離你的身邊,跟...
    Rtia閱讀 865評論 0 2
  • 內存管理的目的就是讓我們在開發中怎么有效的避免我們的應用出現內存泄漏的問題。內存泄漏大家都不陌生了,簡單粗俗的講,...
    宇宙只有巴掌大閱讀 2,403評論 0 12
  • Android 內存泄漏總結 內存管理的目的就是讓我們在開發中怎么有效的避免我們的應用出現內存泄漏的問題。內存泄漏...
    apkcore閱讀 1,237評論 2 7