我有以下问题:
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
。
有什么想法吗?
答案 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();
}
});
}
}
此致