1

この質問がこのフォーラムで何度も出されていることは知っていますが、それでもこの問題を解決する完璧な答えを得ることができません。

私のアプリケーションでは、同じ画像を 3 つの異なるサイズ (小、中、大) で使用しています。

この画像を何度も使用すると、このエラーが発生しました。

08-24 11:08:55.994: E/ImageLoader(636): bitmap size exceeds VM budget
08-24 11:08:55.994: E/ImageLoader(636): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
08-24 11:08:55.994: E/ImageLoader(636):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
08-24 11:08:55.994: E/ImageLoader(636):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:75)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeWithOOMHandling(LoadAndDisplayImageTask.java:161)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:148)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:104)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:58)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
08-24 11:08:55.994: E/ImageLoader(636):     at java.lang.Thread.run(Thread.java:1096)

誰かがそれを整理するのを手伝ってもらえますか..私はすでに同じ問題をたくさん検索しましたが、それでもそのような解決策は得られません..

だからこそ、この午前 4 時に質問を書かなければなりません。

私は肯定的な返事を待っています..

ありがとう。

4

5 に答える 5

1

これは画像の一般的な問題です。Android は各アプリに一定量のスペースを与えます。画像を縮小せずにそのまま撮影すると、この問題が発生しやすくなります。最善の解決策は、

BitmapFactory.Options options = new BitmapFactory.Options();

options.inSampleSize = 8;(ここでは、最適な解を得るために 2 のべき乗として値を使用します)

デコードするときにビットマップに渡します

Bitmap bm = BitmapFactory.decodeStream(<input image file>, null, options);

于 2012-08-24T06:14:29.377 に答える
0
Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

これは、デバイスがメモリ不足になり、強制的に閉じられていることを意味します。

さて、画像を何度も使用するとエラーが発生するとおっしゃっていますので、リソースを解放していないと思います。ビットマップはときどき多くのスペースを占有することがあります。ビットマップをメモリに保持している場合、デバイスが OOM になっても驚かないでしょう。デバイスによってメモリの仕様が異なり、数回実行するとメモリがいっぱいになります。

したがって、一時的な目的で使用しているビットマップとその他のストレージをクリアすることをお勧めします。

それでも問題が解決しない場合は、画像を処理しているコードを投稿してください。よりメモリ効率の良い方法があるかどうかを確認します。

幸運を!

于 2012-08-30T12:18:33.200 に答える
0

この問題を解決するには、失敗の再試行メカニズムを使用できると思います。

のように: 失敗した場合は通常どおり画像を読み込んでみてください。失敗した場合は、catch ブロックから、BitmapConfig (Bitmap.Config.ARGB_4444) を使用して低品質で読み込んでみてください。再び失敗した場合は、さらに低い品質で読み込んでみてください (Bitmap. Config.ALPHA_8)。私も同じ問題を抱えていましたが、今ではこの方法がうまくいきます。

Bitmap imageBitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = false; 
options.inPurgeable = true;
options.inInputShareable = true; 
options.inTempStorage = new byte[32 * 1024];
options.inPreferredConfig = config;//Bitmap.Config.ARGB_4444 or Bitmap.Config.ALPHA_8 when failed  
options.inSampleSize = 1;
imageBitmap = BitmapFactory.decodeFile(bitmapPath, options);
于 2012-08-24T06:21:04.673 に答える
0

このメソッドを使用して、ビットマップをデコードできます。

public static Bitmap loadBitmap() {
    FileInputStream fis = null;
    Bitmap bitmap = null;

    BitmapFactory.Options option = new BitmapFactory.Options();
    option.inDither = false;
    option.inPurgeable = true;
    option.inInputShareable = true;
    option.inTempStorage = new byte[32 * 1024];
    option.inPreferredConfig = Bitmap.Config.RGB_565;

    try {
        fis = IOHelper.openInputStream(); //get the picture's FileInputStream
        FileDescriptor fd = fis.getFD();
        bitmap = BitmapFactory.decodeFileDescriptor(fd, null, option);
    } catch (IOException e) {

    } finally {
        IOHelper.closeQuietly(fis);
    }
    return bitmap;
}
于 2012-08-24T06:35:25.410 に答える
0

これは古い質問ですが、優れた UIL を使用して古いデバイスのイメージ メモリの問題を修正しようとして丸一日を無駄にしてしまいました。これらの答えはどれもUILに固有のものではありません。私の解決策は、最終的にNostra自身が答えたこの質問に出くわしたことから生まれました:

Android Universal Image Loader でビューに表示する前に画像のサイズを変更するにはどうすればよいですか?

ここでのmaxImageWidthForMemoryCacheと高さの値は、私にとって非常に重要でした。画面とほぼ同じサイズの画像をダウンロードして表示し、画面の幅と高さの画像ビューに配置していたので、実際にはスケーリングはまったく行われませんでした。これは私の 2.3 フォンには大きすぎたので、寸法を半分にカットしたことで、画像の劣化がほとんど目立たなくなりました。

于 2014-05-02T00:52:06.223 に答える