原本一切都很好。我一直在努力與5個繪製資源目錄與可繪製資源直接配置有關的Android內存不足崩潰
drawable-hdpi
drawable-ldpi
drawable-mdpi
drawable-xhdpi
drawable-xxhdpi
我由Eclipse ADT-軟件包時,我創建了一個新的項目最近創建的
。所以當我需要一個新的位圖時,我一直在把這個位圖的一個副本放到這5個目錄中的每一箇中。對我來說,這似乎有點奇怪,所以我很高興通過閱讀the Android documentation Providing Resources發現我可以爲所有常見位圖設置一個「drawable」目錄。所以我切換到
drawable
drawable-hdpi
drawable-ldpi
drawable-mdpi
drawable-xhdpi
drawable-xxhdpi
是留在原來的5個目錄是「ic_launcher.png」文件已經爲我創建的項目最初創建時的唯一文件。
但是,可繪製目錄的新配置失敗了。裝載了一個36K位圖文件frame.png,存儲器外的錯誤發生現在作爲行
bitmap_fancyframe = BitmapFactory.decodeResource(getResources(), R.drawable.frame);
的logcat的顯示,Android現在試圖分配一個字節6790156存儲器塊作爲結果的結果線(這是在logcat底部提到的線DrawOnTop.java:95)
06-01 07:26:53.995: I/dalvikvm-heap(1530): Forcing collection of SoftReferences for 6790156-byte allocation
06-01 07:26:54.025: D/dalvikvm(1530): GC_BEFORE_OOM freed 9K, 14% free 53820K/62343K, paused 27ms, total 27ms
06-01 07:26:54.025: E/dalvikvm-heap(1530): Out of memory on a 6790156-byte allocation.
06-01 07:26:54.025: I/dalvikvm(1530): "main" prio=5 tid=1 RUNNABLE
06-01 07:26:54.025: I/dalvikvm(1530): | group="main" sCount=0 dsCount=0 obj=0x41077508 self=0x40de49a0
06-01 07:26:54.025: I/dalvikvm(1530): | sysTid=1530 nice=0 sched=0/0 cgrp=apps handle=1075179312
06-01 07:26:54.025: I/dalvikvm(1530): | schedstat=(681383064 1229707806 4777) utm=53 stm=14 core=0
06-01 07:26:54.025: I/dalvikvm(1530): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
06-01 07:26:54.025: I/dalvikvm(1530): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
06-01 07:26:54.025: I/dalvikvm(1530): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:476)
06-01 07:26:54.025: I/dalvikvm(1530): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:499)
06-01 07:26:54.025: I/dalvikvm(1530): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:529)
06-01 07:26:54.025: I/dalvikvm(1530): at com.example.MyApp.DrawOnTop.<init>(DrawOnTop.java:95)
任何人都可以解釋爲什麼會發生這種情況?更重要的是,這個frame.png文件在我的代碼中被縮放和拉伸,所以我真的不需要它的5個副本,所以有沒有什麼辦法可以在沒有這些類型的'drawable'目錄中擁有所有常見的png位圖的問題?
更新感謝來自@sam的評論以及來自@ ken-wolf的回答,我現在明白如果正確類型的位圖不可用,Android會執行大量的位圖縮放。因此,當我簡單地在所有目錄之間複製相同的位圖時,我的新理解是,這樣做的效果是位圖將不加縮放地加載。在這個縮放過程中,有些事情顯然是錯誤的,但是由於我在做自己的縮放,所以我也不需要Android來做。所以我現在認爲重要的問題是:如何設置我的應用程序,以便只提供每個位圖的一個版本,並指示Android不要執行任何位圖縮放。
http://static.googleusercontent.com/external_content/untrusted_dlcp/www.google.co m/en // events/io/2011/static/presofiles/memory_management_for_android_apps.pdf – Sam