0

ホーム レイアウトに 2 つImageViewあり、そのコンテンツは、以下のコード スニペットに示すように、SD カードに配置された画像から取得されます。

try {
        String tempPath1 = Environment.getExternalStorageDirectory()
                + File.separator + "Clipping_Pictures" + File.separator
                + "06-05-2013_02-06-09pm.png";
        File f = new File(tempPath1);
        Bitmap b = null, b2 = null;
        b = BitmapFactory.decodeFile(f.getPath());

        if (f.exists()) {
            ivClip1.setImageBitmap(b);//ivClip1 is ImageView
        }

        tempPath1 = Environment.getExternalStorageDirectory()
                + File.separator + "Clipping_Pictures" + File.separator
                + "06-05-2013_02-06-33pm.png";
        f = new File(tempPath1);
        b2 = BitmapFactory.decodeFile(f.getPath());

        if (f.exists()) {
            ivClip2.setImageBitmap(b2);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

アプリを初めてロードすると、両方の画像がそれぞれのイメージビューに表示されます。しかし、2 回目の起動時に次の例外でアプリがクラッシュします:
OutOfMemoryError: ビットマップ サイズが VM の予算を超えています

2 つのリソース イメージは.pngで、サイズはそれぞれ ~850kb であることに注意してください。

SO とインターネットに同様のスレッドがあり、提案された解決策のいくつかを試しましたが、どれもうまくいかないようです。

どんな助けでも感謝します。

4

4 に答える 4

3

病棟で Android 3.0 用のアプリをビルドしている場合は android:largeHeap="true"、マニフェスト ファイルのアプリケーション タグで属性を使用できます。これを行うことで、メモリ不足が原因でアプリがクラッシュしないことを願っています。

次に例を示します。

応用

android:allowBackup="true"
android:icon="@drawable/icon_96x96"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@android:style/Theme.NoTitleBar" 

ありがとう!

于 2013-06-05T11:20:45.990 に答える
1

このすべてのコードを onCreate() または onResume() から実行していますか?

画像 (ivClip1.setImageBitmap(null) または軽量の画像) を再度ロードする前に、ビューを消去してみてください。これは、両方のビットマップをデコードしている間、表示中にメモリ内に以前のインスタンスがまだ残っているためです。

于 2013-06-05T10:58:04.940 に答える
1

ビットマップのサイズが大きいためです。次のコードを使用してビットマップを圧縮します。

Bitmap ShrinkBitmap(byte[] file, int width, int height){

         BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
            bmpFactoryOptions.inJustDecodeBounds = true;
            Bitmap bitmap = BitmapFactory.decodeByteArray(file, 0, file.length, bmpFactoryOptions);


            int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)height);
            int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)width);

            if (heightRatio > 1 || widthRatio > 1)
            {
             if (heightRatio > widthRatio)
             {
              bmpFactoryOptions.inSampleSize = heightRatio;
             } else {
              bmpFactoryOptions.inSampleSize = widthRatio;
             }
            }

            bmpFactoryOptions.inJustDecodeBounds = false;
            bitmap = BitmapFactory.decodeByteArray(file, 0, file.length, bmpFactoryOptions);
         return bitmap;
        }
于 2013-06-05T11:11:17.377 に答える