2015-11-03 181 views
9

我正在使用AdView和LeakCanary。承载adView的片段在onDestroy中调用adView.destroy(),但LeakCanary显示托管此片段的Activity由com.google.android.gms.common.api.a.a.a.i 泄露。堆转储还显示有内存泄漏。当我删除AdView.loadAd()并且不在片段中加载广告时 - 没有泄漏。任何想法或建议?谢谢。AdView导致内存泄漏

回答

1

你可以尝试以下方法:

  • onDestroyView()
  • 移动你的逻辑首先从包装箱中取出您的adView,然后调用destroy(),即

    ViewParent parent = adView.getParent(); 
    if (parent != null && parent instanceof ViewGroup) { 
        ((ViewGroup) parent).removeView(adView); 
    } 
    
    adView.destroy(); 
    adView = null; 
    
+1

不幸的是仍然有内存泄漏。看起来adView拥有活动参考。 –

+0

我从来没有遇到过任何使用AdView的内存泄漏,我们都在使用DFP。你能确保你使用最新的播放服务。我肯定这是其他的东西,但不能没有看到一些源代码说。 –

+0

您是否使用LeakCanary或堆转储测试应用程序?我正在使用最新的8.1.0播放服务 –

6

同样的问题,AdView有一个内部变量(强引用),保持在上下文中,这是我的Activit y,导致Activity实例泄漏。

我的依赖是com.google.android.gms:play-services-ads:8.3.0

一个解决方法是创建AdView的实例时提供的应用程序上下文。

AdView adview = new AdView(getApplicationContext()); 
+0

但是,如果我们在XML中使用adView,那么这是不能做到的。我试图销毁adView onDestroy,但没有帮助。 –

+0

@Funkyidol ya布局inflater可能提供活动作为AdView的上下文layout xml。以编程方式向视图组添加视图并不是那么糟糕 – dvd

+0

这是我唯一能解决的问题,我现在无法将它添加到XML布局中... – eliasbagley