2012-02-11 6 views
3

私は約30ビットマップをメモリに読み込むAndroidアプリを持っています。これらは455x320ピクセルのjpgリソースです。Galaxy Nexusのライブ壁紙のビットマップでOutOfMemoryエラーが発生しました

これは、G1からGalaxy Nexusまでテストしたすべてのデバイスで動作します。

私はLiveWallpaperであるこのアプリの別のバージョンを持っています。これは、Nexus One、マイルストーン、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) 

は誰がメモリに複数のビットマップをロードする問題がありましたギャラクシーネクサスのLWPで?

EDIT: 私はOutOfMemoryErrorsを回避する方法を発見した:私の具体的なイメージが不透明であることから、私はアルファチャンネルを必要としないので、私はBitmap.Config.RGB_565の代わりBitmap.Config.RGB_8888を使用することができます。この方法では、私の画像は以前のようにメモリの半分を使用しています。

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

+0

私のコードを最適化する方法があるかもしれません。しかし、私にとって困惑しているのは、同じロジックが2.xと3.xでは動作するが、4.xでは動作しないということである。 – Carmen

関連する問題