2013-10-10 61 views
1

我正在編寫一個Android應用程序,允許在對數據執行某些信號處理時播放錄製的文件。Android:OutOfMemory在重新開放活動的應用程序中發生異常

從列表視圖中選擇一個文件,這將啓動播放和處理髮生的新活動。在onBackPressed方法中,我調用finish來結束活動並返回到列表視圖,用戶可以在其中選擇另一個文件。

一次選擇一個小文件或一個大文件時,一切正常,但是當再次選擇一個大文件時,會拋出OutOfMemoryError異常。

我已經使用DDMS來查看我的內存堆,並且很明顯,返回到列表視圖時,活動的內存不會被釋放。它基於正在加載的文件的大小累積。

儘管進行了大量的研究,我無法確定內存泄漏的來源。我已將Bitmap和Context參考視爲原因,但這些似乎不成問題。文件加載本身也不會出現問題,因爲我有另一個類似的活動,使用從麥克風獲取的實時音頻。

1)什麼可能是內存泄漏的原因?

2)如何確保在完成/ ondestroy被調用時釋放一個活動的內存。

+0

當您完成活動時,您是否明確地關閉了文件? –

+0

咋,我關閉文件(很確定文件本身不是問題)。我創建了一個簡單的測試應用程序,我所做的就是加載一個新的活動並填充大量數據(一個大型浮動500萬元素)。 OnBackPressed我打完了。這也導致類似的內存不足異常,在這種情況下調用system.gc可以解決問題。但在我的實際應用系統中,似乎沒有相同的效果。我知道system.gc不是一個指令,而是一個建議。 – user2819360

+0

完成活動而不關閉文件/數據庫/端口等你打開的東西。 –

回答

0

您可以將'WeakReference'組件附加到您的大數據塊。這將釋放您在需要時保留的舊關聯內存塊。因此,在另一個文件獲取/請求內存後,它會釋放那些舊的'WeakReference'塊,並且應該以這種方式解決內存問題。這應該起作用,因爲它似乎只在特定時間需要該文件,並且通過這種方法,您可以讓系統擔心何時釋放它而不必擔心。

+0

謝謝,剛試過。不幸的是,它似乎沒有解決問題。 – user2819360

+0

如果您只將弱引用分配給大內存塊,則表示文件中的內存不是問題。它可能駐留在意外的上下文泄漏或導致問題的遞歸性質中。你將不得不發佈堆棧跟蹤和/或代碼。 –

相關問題