2

コードでエラーが発生しています:メモリ不足エラー

以下は私のコードです:

public class ViewFullImage extends Activity {

    //Bitmap bitmap;
    private Bitmap bitmap;
    private ImageView iv;
    private String ImgFile_Name;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.view_draw_picture);

    Log.v("","===================== viewFullImage.java================");

    try{
    String  path = "mfc/cam_img/";


    int s_id=getIntent().getIntExtra("s_id", -1);
    int intentKey=getIntent().getIntExtra("iv", -1);

    iv = (ImageView)findViewById(R.id.iv_display);

    File Dir= Environment.getExternalStorageDirectory();
    File imageDirectory = new File(Dir,path);
    File file  = new File(imageDirectory, "img_"+s_id+"_"+intentKey+".jpg");

    ImgFile_Name = file.getAbsolutePath();

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = false;
    options.inSampleSize = 1;

    BitmapFactory.decodeFile(file.getAbsolutePath(),options);


    int h = options.outHeight;
    int w = options.outWidth;

    Log.v("","This is h : "+h);
    Log.v("","This is w : "+w);

    bitmap = BitmapFactory.decodeFile(ImgFile_Name,options);

    iv = (ImageView)findViewById(R.id.image);

    if(h<w)
    {

        iv.setImageBitmap(rotateBitmap(bitmap));
    }
    else{
        iv.setImageBitmap(bitmap);
    }
    }catch (Exception e) {
        // TODO: handle exception

        Log.v("","Exception : "+e);
    }
    }

    Bitmap rotateBitmap(Bitmap bitmap)
    {
        Matrix matrix = new Matrix();
        matrix.postRotate(90);
        Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0, 
                bitmap.getWidth(), bitmap.getHeight(), 
                                      matrix, true);
        bitmap.recycle();
        bitmap=null;

        return bitmap1;
    }
}

このクラスでは、sdcard から画像を表示しようとしています。私はこのアクティビティを他のアクティビティから呼び出しています

 Intent intent =new Intent(cxt,ViewFullImage.class);
 intent.putExtra("iv", 8);
 intent.putExtra("s_id", s_id);
 startActivity(intent);

どこでミススタックをしているのか誰か教えてください.....

4

1 に答える 1

1

メモリに収まるかどうかを知らずに、Android で画像 (または大きな文字列でさえ) を割り当てることはできません。

Android 4 デバイスで問題が発生するのは、ヒープが 16MB しかない 4.0 デバイスが他にもあるためです。メモリ ヒープは、画像を開くメモリです。

この問題を解決するには、必要に応じてイメージをスケーリングする必要があります (ヒープ サイズとイメージ サイズの両方に応じて)。以下は、スケーリングを使用してデコードする方法のコードです。

public static Bitmap decodeSampleImage(File f, int width, int height) {
    try {
        System.gc(); // First of all free some memory

        // Decode image size

        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f), null, o);

        // The new size we want to scale to

        final int requiredWidth = width;
        final int requiredHeight = height;

        // Find the scale value (as a power of 2)

        int sampleScaleSize = 1;

        while (o.outWidth / sampleScaleSize / 2 >= requiredWidth && o.outHeight / sampleScaleSize / 2 >= requiredHeight)
            sampleScaleSize *= 2;

        // Decode with inSampleSize

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = sampleScaleSize;

        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (Exception e) {
        Log.d(TAG, e.getMessage()); // We don't want the application to just throw an exception
    }

    return null;
}

もう 1 つのことは、メモリ (System.gc()) を解放せずに多数の画像をクリックまたは切り替えると、とにかくメモリが不足する可能性があることです。メモリが不足している場合は、アプリを吹き飛ばしたくありません。代わりに、ビットマップが null の場合を管理してください。そのための例外のキャッチ ケースも改善できます。

それが役に立てば幸い。

于 2013-06-28T13:21:42.983 に答える