2012-05-17 35 views
10

當應用程序從啓動畫面加載到主頁時,會發生這種情況。這種事只在設備上不是模擬器:Android - Grow Heap(碎片大小寫) - 字節分配..不加載任何位圖

05-17 08:10:16.627: I/dalvikvm-heap(14021): Grow heap (frag case) to 20.580MB for  2424256-byte allocation 
05-17 08:10:16.666: D/dalvikvm(14021): GC_FOR_ALLOC freed 1K, 3% free 21000K/21511K, paused 21ms 
05-17 08:10:16.697: D/dalvikvm(14021): GC_CONCURRENT freed 116K, 3% free 20885K/21511K, paused 2ms+2ms 
05-17 08:10:16.720: D/dalvikvm(14021): GC_FOR_ALLOC freed 44K, 4% free 20841K/21511K, paused 10ms 
05-17 08:10:16.728: I/dalvikvm-heap(14021): Grow heap (frag case) to 24.533MB for 4310896-byte allocation 

我用Ecplise MAT - 字節分配解決 - Android.Graphics.Bitmap $預載圖片...

我使用的設備是谷歌Nexus Prime,Android 4.0

有沒有人遇到過相同的問題?有人可以投擲一些專業知識....

+0

什麼是您正在加載的位圖的大小? –

回答

10

您可能試圖解碼一個非常大的Bitmap這將導致OutOfMemory異常。這意味着您嘗試實現的操作超出了設備上每個應用程序允許的虛擬機預算,從堆內存消耗(設備上似乎爲24 MB,可能更多位於您的模擬器上,這就是爲什麼它不會沒有發生!)。

嘗試通過兩個因素例如品嚐你的Bitmap

BitmapFactory.Options o = new BitmapFactory.Options(); 
o.inSampleSize = 2; 
Bitmap b = BitmapFactory.decodeFile(pathToBitmap, o); 
+0

decodeFile()中「file」的含義是什麼。 –

+1

@AmitJayaswal感謝您指出這一點,我編輯了。它是一個字符串,表示要解碼的文件的路徑。 –

14

我經歷過同樣的問題,並找到了解決的辦法。

你正在從資源中加載你的位圖嗎?如果是這樣,請嘗試將它們放置在相應的可繪製文件夾中,而不是將它們保留在「drawable」或「drawable-mdpi」中。

當您將圖片資源置於普通可繪製文件夾中時,系統就意味着drawable-mdpi。因此,具有高分辨率或超高分辨率的設備(我認爲Galaxy Nexus是超高分辨率)將擴展該資源以匹配設備的dpi。

如果您的資源只有1個大小,請將它們放在drawable-nodpi中,它將按原樣使用。然而,你的一些佈局可能會受到這種影響,所以我在可繪製文件夾中保存了某些圖像(如按鈕圖像等),並將背景和其他更大的資源移動到drawable-nodpi中。

希望這有助於;)

+0

我將所有圖像放在drawable-hdpi文件夾中。但是我在drawable文件夾中有另一個xml文件,它是用於按鈕的stateChangingStyles的。那些xml文件包含圖像......這會引起關注嗎? – Ashwin

+0

@Ashwin在可繪製文件中有xml文件不應該成爲問題。 hdpi文件夾中存儲的位圖有多大?我建議你嘗試將它們放在xhdpi或no-dpi中,看看你是否得到了同樣的錯誤。 – hjm

+0

我將圖像更改爲建議的文件夾,但無效。我擁有的所有圖像都是png格式,我在整個應用程序中的最大圖像只有77kb。這沒有意義,因爲它在初始啓動期間分配了24 MB。 – Ashwin