2017-10-17 101 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原生广告。这是对的吗?如果不是,请告诉如何将原生广告缓存一小时? –