2017-10-17 97 views
-1

我用碎片實現活動。在每個片段中,我實現了RecyclerView。在每第n行之後的RecyclerView中,我從已經持有視圖的單身人員類中附加了靜態視圖。在onDestroy活動中,我從GridLayoutManager中刪除所有視圖,並從RecyclerView中刪除所有視圖並清除適配器對象。做完所有的事情之後,我也從我的單例類中清除靜態視圖。但LeakCanary檢測到該行的內存泄漏活動。如何避免內存泄漏以及如何刪除任何持有靜態上下文的視圖?活動實例泄漏內存

int adPosition = FacebookAdCenter.getInstance().getAdPosition(position); 
     View adView; 
     if (adPosition >= 0) { 
      adView = FacebookAdCenter.getInstance().getNativeAdViewWithAdPosition(adPosition); 
     } else { 
      adView = null; 
     } 
     if (adView == null) { 
      adView = FacebookAdCenter.getInstance().getNativeAdView(position); 
      if (adView.getParent() != null) { 
       ((ViewGroup) adView.getParent()).removeView(adView); 
      } 
      itemView.addView(adView); 
     } else { 
      if (adView.getParent() != null) { 
       ((ViewGroup) adView.getParent()).removeView(adView); 
      } 
      itemView.addView(adView); 
     } 

其實我想緩存Facebook廣告重用他們一個小時。但不幸的是,我仍然沒有成功。如果我使用靜態參考來存儲廣告,則會出現內存泄漏。我不知道其他方式來正確緩存Facebook廣告。

回答

0

在每第n個項目行視圖之後的RecyclerView中,我從已經擁有視圖的My singleton類中附加了靜態視圖。

不要這樣做。

如何避免內存泄漏

不要static領域的參考意見。

在Java總體上,易變的static字段(即非常量)是代碼異味。在Android中,我們允許他們多一點,但他們主要用於緩存或調解組件之間的通信。 A View不能在組件(活動)之間重複使用。

+0

如果我想在應用程序中保留一些半小時的數據而不泄漏活動實例的內存,我該怎麼辦? –

+0

@WakilAhmad:保留*數據*,而不是UI小部件,活動等。簡單的舊Java對象(PO​​JO)很好,除了大小問題。 – CommonsWare

+0

我想持有Facebook原生廣告。這是對的嗎?如果不是,請告訴如何將原生廣告緩存一小時? –