很抱歉,如果这是某种重复的问题。我用Google搜索了大约一个小时但仍然存在WebView组件的内存使用问题。
我从ListActivity开始一个Activity(NewsDetail)来显示特定的新闻文章。该文章的HTML代码被添加到活动布局中包含的WebView中。 (它还通过 newsDetail.loadDataWithBaseURL()加载1或2个图像)
我正在开始文章活动:
Intent i = new Intent(getApplicationContext(), NewsDetail.class);
i.putExtra("position", position);
startActivity(i);
阅读this question后,我更改了布局,以便以编程方式添加WebView:
newsDetail = new WebView(getApplicationContext());
在我的onDestroy方法中设置:
public void onDestroy(){
super.onDestroy();
newsDetail.destroy();
newsDetail = null;
finish();
System.gc();
}
一段时间后,垃圾收集器将内存量从大约4 MB减少到2 MB。如果我打开/关闭几篇新闻文章,它会升级到一个关键的堆大小。 :/
如上所述,在销毁活动之后,活动剩余2 MB(如果我从代码中完全删除了WebView,则不存在)。所以它似乎与WebView本身有关。 同样的问题is mentioned here。
我也设置了:
android:noHistory="true"
有谁知道如何在返回我的ListActivity后彻底摆脱“NewsDetail”活动的内存使用? 很高兴听到任何想法,这让我发疯。 Android手机是否有超过16 MB堆大小的图表?
答案 0 :(得分:3)
我认为这是一个已知的错误。请参阅此官方http://code.google.com/p/android/issues/detail?id=2137
您可以参考此链接,让我们知道这是一个已知问题或
答案 1 :(得分:1)
有一个mParent引用,它指向包含WebView并最终包含在Activity中的ViewGroup。 WebView会泄漏任何可以触及的内容,因此您必须将其从视图层次结构中删除。
请在此处查看我的回答:
答案 2 :(得分:0)
如果您的onDestroy
位于newsDetail
活动中,那就是一种奇怪的代码。
首先你做super.onDestroy()
哪个应该做你想要的,所以对象被标记为GC。但是在你引用同一个对象后的行中。我不是专家,但可能会引起麻烦。
如果onDestroy
方法位于listActivity
内,那么它无法正常工作,因为listActivity
保持打开而其他newsDetails
永远不会调用该方法打开了。