私は約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);
私はこの解決策がより大きいまたはより大きなイメージのために拡大するとは思わないので、私はまだ他のコメントに興味があると思います。
320x455解像度の画像の理由は、もともとG1のアプリであったため、後でライブ壁紙に適応したためです。 30の画像がある理由は、さまざまなアニメーションで使用されているためです。私はそれらを読み込んでキャッシングしないようにしましたが、アニメーションはかなり遅くなりました。特定のアニメーションの特定のイメージをロードしてキャッシュするだけでしたが、OOMエラーがありました。私は画像のプールでは、最適なサイズを見つけることが難しいかもしれません:あまりにも大きいと私はOOMのエラーを得るだろう、小さすぎると私は不安定なアニメーションを持っていただろう。 – Carmen
私のコードを最適化する方法があるかもしれません。しかし、私にとって困惑しているのは、同じロジックが2.xと3.xでは動作するが、4.xでは動作しないということである。 – Carmen