WebView内存泄漏

时间:2011-03-14 14:08:01

标签: android memory-management webview

很抱歉,如果这是某种重复的问题。我用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堆大小的图表?

3 个答案:

答案 0 :(得分:3)

我认为这是一个已知的错误。请参阅此官方http://code.google.com/p/android/issues/detail?id=2137

您可以参考此链接,让我们知道这是一个已知问题或

答案 1 :(得分:1)

有一个mParent引用,它指向包含WebView并最终包含在Activity中的ViewGroup。 WebView会泄漏任何可以触及的内容,因此您必须将其从视图层次结构中删除。

请在此处查看我的回答:

Memory leak in WebView

答案 2 :(得分:0)

如果您的onDestroy位于newsDetail活动中,那就是一种奇怪的代码。 首先你做super.onDestroy()哪个应该做你想要的,所以对象被标记为GC。但是在你引用同一个对象后的行中。我不是专家,但可能会引起麻烦。

如果onDestroy方法位于listActivity内,那么它无法正常工作,因为listActivity保持打开而其他newsDetails永远不会调用该方法打开了。