首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AdView导致内存泄漏

AdView导致内存泄漏
EN

Stack Overflow用户
提问于 2015-11-04 05:26:47
回答 5查看 3.3K关注 0票数 18

我使用的是AdView和LeakCanary。托管adView片段调用onDestroy中的adView.destroy(),但LeakCanary显示托管此片段的活动被com.google.android.gms.common.api.a.i泄露。堆转储还显示存在内存泄漏。当我删除AdView.loadAd()并且没有在片段中加载Ad时-没有泄漏。有什么想法或建议吗?谢谢。

EN

回答 5

Stack Overflow用户

发布于 2016-02-01 08:12:58

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

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

变通方法是在创建AdView实例时提供应用程序上下文。

代码语言:javascript
复制
AdView adview = new AdView(getApplicationContext());
票数 14
EN

Stack Overflow用户

发布于 2018-10-26 13:29:52

我认为将应用程序上下文传递给AdView是,而不是一个解决方案,实际上是。因为问题是AdView没有释放上下文对象。因此,如果您传递它,它将不会释放应用程序上下文。

因此,下面是一个解决办法,可以真正防止泄漏。

代码语言:javascript
复制
@Override
protected void onDestroyView() {
    super.onDestroy();
    if (adview != null && adview.getParent() != null) // inflated by XML and remove here from parent
        ((ViewGroup) adview.getParent()).removeView(adview);
    adview.destroy(); 
    adview = null;
}

1.销毁onDestroyView中的Adview

  • Fragment lifecycle有onDestroyView方法,当视图被销毁时调用,所以你应该在这个地方销毁AdView。
  • 在你的例子中,你正在销毁onDestroy中的AdView (After onDestroyView),所以它是一个漏洞。因为在Fragment View is destroyed.
  • An AdView Activity 没有onDestroyView方法后,视图仍然存在,所以视图在Activity中的onDestroy中被销毁。因此,我们在onDestroy.

中清除了对象

2.以编程方式将AdView从视图中移除。

但是如果我们在

中使用adView,那么这是不可能的。

因为您希望从XML中膨胀视图,所以删除onDestroy中的AdView就可以完成这项工作。

3.在onDestroyView中使AdView为空

Make AdView null in onDestroy。因此,AdView对象将不再被引用。它将被垃圾收集器清理。

我希望这些信息对你有用。:)

票数 3
EN

Stack Overflow用户

发布于 2015-11-04 05:36:35

您可以尝试以下操作:

onDestroyView()

  • first中移动您的逻辑,从容器中删除您的,然后调用
  • (),即adView

ViewParent父实例= adView.getParent();if (父实例!=空&ViewGroup的父实例){ ((ViewGroup)父实例).removeView( adView );} adView.destroy();adView=空;

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33509371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档