我使用的是AdView和LeakCanary。托管adView片段调用onDestroy中的adView.destroy(),但LeakCanary显示托管此片段的活动被com.google.android.gms.common.api.a.i泄露。堆转储还显示存在内存泄漏。当我删除AdView.loadAd()并且没有在片段中加载Ad时-没有泄漏。有什么想法或建议吗?谢谢。
发布于 2016-02-01 08:12:58
同样的问题,AdView有一个内部变量(强引用)持有上下文,这是我的Activity,导致Activity实例泄漏。
我的依赖项是com.google.android.gms:play-services-ads:8.3.0
变通方法是在创建AdView实例时提供应用程序上下文。
AdView adview = new AdView(getApplicationContext());发布于 2018-10-26 13:29:52
我认为将应用程序上下文传递给AdView是,而不是一个解决方案,实际上是。因为问题是AdView没有释放上下文对象。因此,如果您传递它,它将不会释放应用程序上下文。
因此,下面是一个解决办法,可以真正防止泄漏。
@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
onDestroyView方法,当视图被销毁时调用,所以你应该在这个地方销毁AdView。onDestroy中的AdView (After onDestroyView),所以它是一个漏洞。因为在Fragment View is destroyed.onDestroyView方法后,视图仍然存在,所以视图在Activity中的onDestroy中被销毁。因此,我们在onDestroy.中清除了对象
2.以编程方式将AdView从视图中移除。
但是如果我们在
中使用adView,那么这是不可能的。
因为您希望从XML中膨胀视图,所以删除onDestroy中的AdView就可以完成这项工作。
3.在onDestroyView中使AdView为空
Make AdView null in onDestroy。因此,AdView对象将不再被引用。它将被垃圾收集器清理。
我希望这些信息对你有用。:)
发布于 2015-11-04 05:36:35
您可以尝试以下操作:
在onDestroyView()
adView。ViewParent父实例= adView.getParent();if (父实例!=空&ViewGroup的父实例){ ((ViewGroup)父实例).removeView( adView );} adView.destroy();adView=空;
https://stackoverflow.com/questions/33509371
复制相似问题