0

私が開発しているアプリの場合、GridView に多くの画像を入力しようとしています。OutOfMemoryExceptions を回避するために、使用可能なメモリの量を確認し、特定のしきい値に達したら、次のようにメモリを解放しようとします。

private void freeUpMemory() {
    // Clear ImageViews up to current position
    for (int i = 0; i < mCurrentPosition; i++) {
        RelativeLayout gridViewElement = (RelativeLayout) mGridView.getChildAt(i);
        if (gridViewElement != null) {
            ImageView imageView = (ImageView) gridViewElement.findViewById(R.id.image);
            imageView.getDrawable().setCallback(null);
            imageView = null;
        }
    }
}

これは実際にはメモリを解放しないことに気付きました。私が知らないのは、その理由です。何か不足していますか?

4

2 に答える 2

3

ImageAdapter が convertView が null でない "getView()" コールバックを取得すると、ImageAdapter によって以前に提供されたこのビューが画面に表示されなくなったことがわかります。これは、ビューで使用されているリソースを回復する良い機会です。次のようなもの:

 ImageView iv = (ImageView)convertView.findViewById(R.id.image_view_in_grid_item);
 iv.setDrawable(null);

ImageView に格納されている Drawable への参照を削除する必要があります。コード内にその Drawable への参照が他にない場合は、ガベージ コレクションに使用できるはずです。

さらに良いことに、表示する別の画像がある場合。

iv.setDrawable(newImage);

次に、グリッドで使用される新しいビューとして convertView を返すと、古い Drawable が新しいものに置き換えられ、参照が削除され、画像のガベージ コレクションが発生する可能性があります。

于 2013-08-05T18:05:08.567 に答える
0

Android の BitmapFactory.Options クラスを見てください。Bitmap には多くのコントロールが用意されており、多くの画像を扱う場合に非常に興味深いものが 2 つあります。

最良の解決策は、 inSampleSizeを 2 や 4 などの値に設定することだと思います。これにより、画像の品質が低下しますが、多くのメモリが節約されます。適切な比率が見つかるまで、さまざまな値を試してください。

Android ドキュメントのサンプル ( http://developer.android.com/training/displaying-bitmaps/load-bitmap.html ) :

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
    int reqWidth, int reqHeight) {

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}

システムが既存のビットマップからスペースを使用できるようにするinPurgeableもありますが、クラッシュや無効なビットマップにつながる可能性があるため注意が必要です。

于 2013-08-05T16:05:30.370 に答える