3

アプリケーションに多くの画像を表示する必要があります。これらはjpgとpngであり、次のようにImageViews内にロードしています。

tile.setImageResource(R.drawable.tile_highlight);

現在、OutOfMemoryの問題が発生しています(java.lang.OutOfMemoryError: bitmap size exceeds VM budget

私は他のいくつかの投稿を検索して見つけましたが、それらはすべて、ImageViewのビットマップを手動でリサイクルする必要があることを示唆しています。たとえば、((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();メモリからダンプします。

しかし、私の場合、setBitmap()ImageViewオブジェクトに画像をロードするために使用していないため、上記のコードを実行しようとするとNullPointerException、メソッドgetBitmap()はnullを返し、ビットマップはありませんか?!?!

コードに戻って、ImageViewsにすべての画像を読み込む方法を変更してから、メソッドを試す必要がありrecycle()ますか?または、メモリを解放してクラッシュしないようにするにはどうすればよいですか?

編集

私はそのようなことを試みました:imageView.setImageResource(-1);それがメモリから画像を削除し、それを... nullか何かに置き換えることを期待して、しかしそれは原因を助けないようです。

4

5 に答える 5

4

コードの一部を投稿できれば便利です。ImageView具体的には、オブジェクトの画像をどのように設定するか。ビットマップを使用していない場合は、getBitmap()nullが返されると思います。ただし、別の種類のDrawable画像を使用している場合は、ビットマップを使用しない同様のルートが使用される可能性があります。

編集:

了解しました。これを試してみてください。Bitmap次のようなリソースからを作成できます。

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.image);

次に、imgがあなたのImageView:であることを考慮して、このようなビットマップを使用します。

img.setImageBitmap(bm);
//Do some stuff with it, then when memory gets low:
((BitmapDrawable)img.getDrawable()).getBitmap().recycle();

もちろん、これはあなたが活動していることを考慮しています。そうでない場合は、コンテキストのハンドルを取得して、に置き換える必要がありgetResources()ますcontext.getResources()

于 2012-07-18T14:18:27.263 に答える
2

ImageView.setImageResource(int resId)画像をドローアブルからImageViewに設定する場合は、ドローアブルIDで直接使用しないでください。代わりに、縮小されたビットマップ(該当する場合)を取得して、imageViewに設定します。このように:これは私のために働きます。

    iv.setImageBitmap(decodeResource(getResources(), R.drawable.big_image));

    private static Bitmap decodeResource(Resources res, int id) {
        Bitmap bitmap = null;
        BitmapFactory.Options options = new BitmapFactory.Options();
        for (options.inSampleSize = 1; options.inSampleSize <= 32; options.inSampleSize++) {
            try {
                bitmap = BitmapFactory.decodeResource(res, id, options);
                Log.d(TAG_LOG, "Decoded successfully for sampleSize " + options.inSampleSize);
                break;
            } catch (OutOfMemoryError outOfMemoryError) {
                // If an OutOfMemoryError occurred, we continue with for loop and next inSampleSize value
                Log.e(TAG_LOG, "outOfMemoryError while reading file for sampleSize " + options.inSampleSize
        + " retrying with higher value");
            }
        }
        return bitmap;
    }

ソース:https ://codingjunkiesforum.wordpress.com/2014/06/12/outofmemory-due-to-large-bitmap-handling-in-android/

于 2015-11-15T05:42:15.030 に答える
1

試す

((BitmapDrawable)im.getBackground()).getBitmap().recycle();
于 2012-07-18T14:30:42.717 に答える
1

より低い解像度で画像を表示する必要があると思います。これにより、OOMの問題が解決されます。Androidデベロッパーガイドラインのリンクも読むことができます

于 2016-04-18T06:54:13.873 に答える
1

OutOfMemoryエラーは、使用後にビットマップを解放しないと発生するため(サイズが大きい場合があります)、これを防ぐために、サイズ変更、弱参照の取得などに注意する必要がありますが、すべての問題を処理している優れたライブラリがあります。彼らはピカソです。ご覧ください-

Picassoを使用した画像の読み込み

于 2016-04-18T08:17:28.080 に答える