0

ビットマップを操作してフォームRGBをグレースケールに変換するルーチンがあります。

通常は正常に動作しますが、サイズが1088kbのビットマップで使用しようとすると、次のエラーが発生します。

java.lang.OutOfMemoryError

私はエミュレーターを使用しています。1088kbはそれほど大きな絵ではありませんが、どうすればメモリを使い果たしてしまうのでしょうか。

正確には、問題のあるコードを呼び出すアプリケーションには、写真のサムネイルのListViewを持つバックスタック上の別のアクティビティが含まれています。

これは方法です:

public Bitmap toGrayscale(Bitmap bmpOriginal)
{        
    int width, height;
    height = bmpOriginal.getHeight();
    width = bmpOriginal.getWidth();    

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    Canvas c = new Canvas(bmpGrayscale);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();
    cm.setSaturation(0);
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
    paint.setColorFilter(f);
    c.drawBitmap(bmpOriginal, 0, 0, paint);
    return bmpGrayscale;
}
4

1 に答える 1

3

メモリ内のビットマップの管理が非常に非効率的であり、メモリリークが発生している可能性があります(ビットマップを使い終わったときにメモリからビットマップを解放したり、ガベージコレクションを行わないアクティビティでビットマップを保持したりしない)。Android開発者には、適切なビットマップ管理のためのページがあります。

http://developer.android.com/training/displaying-bitmaps/index.html

エミュレータでヒープサイズを増やしてみてください。

Androidエミュレータでメモリ不足エラーが発生しましたが、デバイスでは発生しません

エミュレータでヒープサイズを監視します。

https://stackoverflow.com/a/7427803/445131

メモリリークを取り除きます。

メモリ/リソースリークを見つけるのに最適なAndroidのツールと方法は何ですか?

于 2013-02-14T15:10:24.383 に答える