2011-09-19 54 views
4

我有活動A,它通過意圖啓動活動B.活動A沒有對活動B的引用,在我使用的應用程序單例中也沒有對活動B的引用。Android - 內存泄漏,我做錯了什麼?

當我創建活動B時,創建了幾千個對象。沒關係,這是一個帶有大量圖像的非常豐富的ListView的活動。

但是,當我按下後退按鈕並返回到活動A時,幾千個對象中只有大約十幾個被釋放。 onDestroy()也被稱爲活動。我正在使用DDMS查看堆信息,並且多次按'原因GC'強制其釋放內存。

我在其他應用程序(也使用列表視圖)上完成了相同的測試,並且按下後退按鈕然後按'原因GC'銷燬其對象的100%,所以它肯定不是錯誤。

有什麼建議嗎? :-)我已經閱讀了關於泄漏上下文的android文檔中的材料,但這沒有什麼幫助,因爲我沒有引用在其他地方銷燬的活動(或其中的任何內容)。另外,我還有許多其他活動都是以相同的方式工作的,並且不會釋放所有的摧毀記憶。我必須錯過明顯的東西?

編輯:我剛纔意識到我使用的AsyncTasks有活動的引用(或者作爲參數傳遞到doInBackground()或者可以通過outerClass.this訪問它們可以掛在線程池中,甚至在onPostExecute )

編輯:它泄漏就算我回去運行任何asynctasks :-(

編輯前:運行asynctasks如果我刪除AdMob廣告代碼之前沒有泄漏,但其中確實使用asynctasks的activites繼續泄漏。 。所以asynctask仍然是一個很好的候選人:-)

+1

:你有沒有叫System.gc(); – Mak

+2

這就是'原因GC'的原因 – Ted

+1

它只會猜測沒有完整的代碼。你確定你沒有堅持你的'AsyncTasks'與他們對活動的引用或其他引用該活動的對象嗎?例如,在你的'Application'類中。 – ernazm

回答

2

我相信有一個錯誤ListView執行。看看這個問題:Android: AlertDialog causes a memory leak

這是一個錯誤報告:http://code.google.com/p/android/issues/detail?id=12334。它被拒絕了,但我認爲它必須重新開放。

+0

我很有希望,但'lv.setOnItemClickListener(null)'不會改變任何東西。 – Ted

+0

它是唯一使用ListView的監聽器嗎?你有沒有嘗試過使用MAT來確定泄漏的根? – Michael

+0

是的,我也刪除了所有點擊監聽器。我會盡量消除更多的代碼,然後再嘗試MAT。謝謝 – Ted