2011-03-14 45 views
2

对不起,如果这是一种重复的问题。我搜索了大约一个小时,但仍然存在WebView组件的内存使用问题。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后摆脱了“阅读新闻”活动的内存使用情况的? 很高兴听到任何想法,这让我疯狂。是否有提供超过16 MB堆大小的Android手机的图表?

回答

1

有指向包含的WebView,并最终到ViewGroup中一个mParent引用您的活动。 WebView会泄漏任何可以实现的功能,因此您必须将其从视图层次结构中删除。

见我的答案在这里:

Memory leak in WebView

0

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

如果onDestroy方法是你listActivity里面,它是有道理的,这是行不通的,因为,而其他newsDetails被打开的方法不会被调用为listActivity保持打开。