2012-02-11 40 views
3

我有一個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); 

我不認爲這個解決方案會擴大更多或更大的圖像,所以我仍然對其他評論感興趣。

回答

0

那麼,您的解決方案將內存佔用減少了一半(RGB_8888上的4個字節到RGB_565上的2個字節)。但真正的問題在於爲什麼你需要同時加載所有圖像?動態壁紙上的平均主屏幕尺寸爲960 x 800,那麼加載30 455x320圖像的原因是什麼?它不適合,即使這種解決方案適用於大多數手機,您也正在使用大量的內存。我會建議你使用一個位圖池來對圖像進行加密並將其回收。乾杯!

+0

分辨率爲320x455的圖像的原因是,它原本是G1上的一個應用程序,我後來改編爲動態壁紙。 有30張圖片的原因是它們被用在各種動畫中。我嘗試不加載和緩存它們,但動畫變得非常緩慢。我只嘗試加載和緩存給定動畫的特定圖像,但仍有OOM錯誤。恐怕有了一堆圖像,可能很難找到最佳尺寸:太大,我會得到OOM錯誤,太小,我會有動盪不安的動畫。 – Carmen 2012-02-12 22:56:48

+0

我可能有一種方法來優化我的代碼(除了我已經找到的解決方案之外)。但令我費解的是,相同的邏輯適用於2.x和3.x,但不適用於4.x. – Carmen 2012-02-12 23:00:07

相關問題