2012-05-03 62 views
2

我的活動有列表視圖和(除了所有其他東西)從網站加載圖像,並在列表視圖中顯示它們。我可以訪問5個Android設備:2個HTC願望,LG P-350,多一個手機和一個平板電腦。通常情況下,一切工作正常,但在HTC渴望的一個被啓動,應用程序往往與NullPointerException異常,這是由於內存不足的錯誤崩潰(我猜是這樣),這是輸出:內存不足錯誤:巨大的位圖

05-03 14:41:23.818: E/dalvikvm(843): Out of memory: Heap Size=7367KB, Allocated=4991KB, Bitmap Size=16979KB 

後來, logcat輸出堆棧跟蹤nullpointerexception其中一個我的靜態變量突然變爲空(該變量在應用程序的根活動中初始化,在整個應用程序中使用,並且肯定不會在代碼中消失)。我想,由於內存不足,它會被系統清空。 據我不知道,系統試圖分配位圖大到17mb - 我敢肯定加載的圖像不能是那麼大。它們是100 * 70像素,其中任何一個都遠遠小於1mb。 我不明白的另一件事是爲什麼我只在一臺設備上出現此錯誤 - 其他設備正常工作。

在我看來,這看起來很奇怪,我不能找到線索,我需要建議。

+0

1圖像大小小於1MB,所以如果您添加所有圖像大小,那麼它將足以讓您OutOfMemoryError。 – Dharmendra

+0

Btw:沒有系統會使您的變量無效。要麼你的代碼放一個'null'或者該變量還沒有被初始化。唯一可能發生的變量是那些明確爲此而設計的變量:弱/軟引用。 – zapl

+0

我的列表視圖是以項目點擊開始新活動的方式組織的(讓它成爲活動B)。我在listview的onItemClick中設置斷點,在調試模式下運行應用程序,輸入listview活動,按listview項,停在斷點處,檢查靜態變量的值 - 它不爲null。然後我在B的onCreate中放置斷點,在那裏執行停止,我檢查相同的靜態變量的值 - 它已經是空的。它有魔力嗎?我有沒有我的代碼之間的ListView項目點擊偵聽器和B的oncreate。這個變量在這兩個點之間是無效的... –

回答

2

原因很簡單:內存沒有保存你說的JPG數據,而是它的解壓縮等效內容,不用說,它需要比源文件多得多的RAM空間......注意,這17Mb限制是針對所有加載的位圖一次,不一定是一個。

我不得不在我的一個程序(用於Mapquest Android API MapView對象的自定義Tile加載器)中遇到類似的問題,並且最後我不得不盡可能地調用我的位圖的recycle()方法,以及手動迫使垃圾使用System.gc()在關鍵位置收集系統......

對不起,不是最好的消息承載...

你可能會使用相同的策略,像我一樣解決您的問題:我基本上是將加載的位圖緩存在硬盤(如我的外部SD卡)中,並在需要時重新加載它們,而不是試圖將所有內容都保存在RAM中。

+0

如果崩潰是由於大位圖大小造成的,那麼其他設備上的所有設備怎麼樣都可以(其中一個是另一個HTC的願望)? –

+0

我認爲所有Android設備都沒有固定的標準最大RAM佔用空間大小。例如,對於運行Android 2.1的HTC Desire,我的最大佔用空間大約爲17 mb,但是我的Acer Iconia平板電腦需要耗費更多的資源。任何人都可以用一些官方文檔證實這一點?注意:您的第二個Desire設備是否在完全相同的操作系統版本上運行? – epichorns

+0

這是一個內核限制,例如可以在build.prop中更改的dalvik.vm.heapgrowthlimit。 在較舊的設備(或具有較低內存的設備)上,它被設置爲16或24Mb。在最近的設備上它被設置爲64Mb。 – 3c71