2011-03-14 68 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保持打開。