ディスクに 1280x1280 の JPG があり、次のコードを使用してイメージの領域をデコードし (側面を切り取って)、ImageView に表示しています。画像の上部と下部のクリッピングにも同様の問題があります。
private Bitmap decodeBitmapRegion(InputStream in, Rect region, Bitmap recycleBitmap) {
LOGD(TAG, "decodeBitmapRegion region=" + region + ", recycleBitmap=" + recycleBitmap );
Bitmap bitmap = null;
BitmapRegionDecoder decoder = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
options.inBitmap = recycleBitmap;
try {
decoder = BitmapRegionDecoder.newInstance(in, false);
bitmap = decoder.decodeRegion(region, options);
} catch (IllegalArgumentException e){
LOGE(TAG, "Failed to recycle bitmap for rect=" + region, e);
} catch (IOException e) {
LOGE(TAG, "Failed to decode into rect=" + region, e);
} finally {
if (decoder != null) decoder.recycle();
}
return bitmap;
}
Acer Iconia A100 (4.0.3) では、コードは完全に機能し、提供されている場合はリージョンをリサイクル ビットマップにデコードし、ヒープにメモリを割り当てません。logcat には GC またはグロー ヒープ メッセージはありません。4.2.0 を実行している Nexus 7 でも正しく動作しています。
Motorola Xoom (4.0.4) では、コードは次の logcat を生成します。最初の dalvikvm-heap grow (4738256 バイト) はおそらく BitmapRegionDecoder のデータ用であり、2 番目 (3603216 バイト) はイメージ (800x1126x4) を格納するために必要なメモリ量と一致します。スキーエラーもあります。
8522 LocationImageLoader D decodeBitmapRegion region=Rect(240, 77 - 1040, 1203), recycleBitmap=android.graphics.Bitmap@415319a8
8522 dalvikvm D GC_FOR_ALLOC freed 8213K, 28% free 22782K/31623K, paused 34ms
8522 dalvikvm-heap I Grow heap (frag case) to 26.808MB for 4738256-byte allocation
8522 dalvikvm D GC_CONCURRENT freed 6K, 14% free 27403K/31623K, paused 3ms+7ms
8522 skia D WARNING: One-shot allocator has already allocated (alloc count = 1)
8522 dalvikvm D GC_FOR_ALLOC freed 0K, 14% free 27403K/31623K, paused 33ms
8522 dalvikvm-heap I Grow heap (frag case) to 30.238MB for 3603216-byte allocation
8522 dalvikvm D GC_FOR_ALLOC freed 0K, 3% free 30922K/31623K, paused 41ms
設定 options.inPreferredConfig = Bitmap.Config.RGB_565; ビットマップが正しくリサイクルされているかのように、Xoom での 2 番目の割り当てを無効にしているように見えますが、デコーダーに割り当てられたメモリがまだ残っています。
完全なイメージ (1280x1280) と BitmapFactory を使用したリサイクルは機能しますが、完全なイメージを格納するために、領域で必要とされるよりもはるかに多くのメモリが使用されます。
なぜ Xoom が動作しないのか理解できませんが、両方とも Android 4.0.x を実行している場合、Acer は問題ありません。