我有一個Android應用程序將大約30位圖加載到內存中。這些是455x320像素的jpg資源。Galaxy Nexus上的LiveWallpaper上的Bitmap出現OutOfMemory錯誤
這適用於我測試過的所有設備,從G1到Galaxy Nexus。
我有另一個版本的這個應用程序,這是一個LiveWallpaper。它適用於Nexus One,Milestone,Galaxy S2和一些3.x平板電腦。但是,我的應用程序的LWP版本僅在Galaxy Nexus上(ICS上)出現OutOfMemory錯誤。
以下是代碼的簡化版本,我使用的是:
Bitmap bitmap = BitmapFactory.decodeResource(
lwpService.getResources(), R.drawable.somepic);
imageCache.put(R.drawable.somepic, bitmap);
bitmap = BitmapFactory.decodeResource(
lwpService.getResources(), R.drawable.someotherpic);
imageCache.put(R.drawable.someotherpic, bitmap);
… // and so on for 30 more images.
這裏是logcat的堆棧跟蹤:
02-12 00:07:34.456 E/dalvikvm-heap(6938): Out of memory on a 583696-byte allocation.
02-12 00:07:34.456 I/dalvikvm(6938): "Thread-7378" prio=5 tid=16 RUNNABLE
02-12 00:07:34.456 I/dalvikvm(6938): | group="main" sCount=0 dsCount=0 obj=0x4186c3f8 self=0x20e538
02-12 00:07:34.456 I/dalvikvm(6938): | sysTid=7115 nice=0 sched=0/0 cgrp=default handle=2213784
02-12 00:07:34.456 I/dalvikvm(6938): | schedstat=(0 0 0) utm=6907 stm=504 core=1
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.Bitmap.nativeCreate(Native Method)
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:374)
02-12 00:07:34.463 I/dalvikvm(6938): at com.myapp.loadImage(MyApp.java:155)
有任何人有問題加載多個位圖到內存在Galaxy Nexus上的LWP上?
編輯: 我已經找到一種方法避免OutOfMemoryError異常:因爲我具體的圖像是不透明的,我並不需要一個alpha通道,所以我可以用它代替Bitmap.Config.RGB_8888 Bitmap.Config.RGB_565。這樣,我的圖像像以前一樣使用了一半的內存。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeResource(
lwpService.getResources(), R.drawable.somepic, options);
我不認爲這個解決方案會擴大更多或更大的圖像,所以我仍然對其他評論感興趣。
分辨率爲320x455的圖像的原因是,它原本是G1上的一個應用程序,我後來改編爲動態壁紙。 有30張圖片的原因是它們被用在各種動畫中。我嘗試不加載和緩存它們,但動畫變得非常緩慢。我只嘗試加載和緩存給定動畫的特定圖像,但仍有OOM錯誤。恐怕有了一堆圖像,可能很難找到最佳尺寸:太大,我會得到OOM錯誤,太小,我會有動盪不安的動畫。 – Carmen 2012-02-12 22:56:48
我可能有一種方法來優化我的代碼(除了我已經找到的解決方案之外)。但令我費解的是,相同的邏輯適用於2.x和3.x,但不適用於4.x. – Carmen 2012-02-12 23:00:07