在android中使用位图的问题

时间:2011-09-01 12:35:56

标签: android bitmap

我有以下问题:

First activity

Android相机已打开,用户可以拍照。一旦拍摄照片,第二个活动就会启动。

Second activity

在此活动中,用户可以查看照片。 为此我从第一个活动中收到图片,如下:

Bundle extras = getIntent().getExtras();

我创建了以下位图:

BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 5;
        options.inDither = true; 
        byte[] imageData = extras.getByteArray("imageData");
        myImage = BitmapFactory.decodeByteArray(imageData, 0,
                imageData.length, options);

        Matrix mat = new Matrix();
        mat.postRotate(90);
        bitmapResult = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(),
                myImage.getHeight(), mat, true);
        //...operations on the bitmapResult

结果位图存储在sdcard中,在离开此活动之前,我会回收我的位图以避免内存问题:

bitmapResult.recycle();
bitmapResult=null;

完成所有这些后,我们继续进行活动3.

Third activity

在此活动中,用户可以看到不同大小的图片。图片来自sdcard

最大的问题是当用户点击后退按钮时,会从活动three转移到活动two,但我的应用程序崩溃是因为尝试operations on bitmap that has been recycled.

如果我在第二个活动中没有回收位图,那么当我在应用程序中上下几次时,我会得到OutOfMemeory Exception

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

当您的用户在 活动2 时,直接转到活动3 (图库) 。 首先,完成活动2 并将结果返回活动1 。然后开始活动3

您的第一个/主要活动:

public class TakeAPicture extends Activity {

    public static final int REQUEST_PICTURE_WAS_TAKEN = 100;
    public static final int REQUEST_SHOW_GALLERY = 101;
    public static final int RESULT_PICTURE_WAS_TAKEN_SHOW_GALLERY = 102;
    public static final int RESULT_BACK_FROM_GALLERY = 103;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.takeapicture);

        Button btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(),
                        PictureTaken.class);
                startActivityForResult(i, REQUEST_PICTURE_WAS_TAKEN);
            }
        });
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        case REQUEST_PICTURE_WAS_TAKEN:
            if (resultCode == RESULT_PICTURE_WAS_TAKEN_SHOW_GALLERY) {
                Intent i = new Intent(getApplicationContext(), Gallery.class);
                startActivityForResult(i, REQUEST_SHOW_GALLERY);
            }
            break;
        default:
            break;
        }
    }
}

在你的第二项活动中,你必须做这样的事情:

public class PictureTaken extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.picturetaken);

        Button btn = (Button) findViewById(R.id.button2);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                PictureTaken.this
                        .setResult(TakeAPicture.RESULT_PICTURE_WAS_TAKEN_SHOW_GALLERY);
                PictureTaken.this.finish();
            }
        });
    }
}

此致