Android开发经验之intent传递大数据

时间:2022-05-10 21:23:02

今天一上午在解决一个问题就是intent传递数据的时候发现闪退的现象,但是没有报错,我想要实现的功能就是把activity1界面的四张图片加一些信息传递到activity2界面中并且显示出来,但是当我传递两张图片的时候可以正常跳转到activity2,但是传递3张图片的时候就出现闪退的现象,所以断定是因为传递的数据比较大的原因。

网上一查还真是,这绝大多数是由于Bitmap过大导致的,因为Intent值适合传递小数据,当传递的数据较大时(官方并没有给出具体的大小限制,江湖有传言是40k,也有人说是1M,可能跟手机也有关系吧),传递就可能失败甚至程序崩溃。那么,为了避免这种情况的发生,我们的做法应该是:

  1. 如果你对图片大小要求不告,可以先将图片进行压缩,然后在传递,保证图片的大小不高即可
  2. 如果你不想对图片进行压缩,可以将图片缓存到一个类的静态成员中,然后在下一个Activity中取即可
  3. 你也可以将图片先保存在本地,然后在下一个Activity中读取文件

我的做法是第一种,因为activity1显示照片的时候有进行过压缩,所以直接获取

  FileOutputStream out = null;
try {
out = new FileOutputStream(new File(Environment
.getExternalStorageDirectory(),
PHOTO_FILE_NAME));
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, out);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
byte[] byteImage = PicUtils.bitmap2Bytes(bitmap);

PicUtils工具类里面

    /**
* bitmap转换成byte流
*
* @param bm
* @return
*/

public static byte[] bitmap2Bytes(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}

activity1

  Intent intent=new Intent(OChangeCardFillInfoActivity.this,OChaneCardFillDetailActivity.class);
intent.putExtra("name",shouhuo_name.getText().toString());
intent.putExtra("address",shouhuo_address.getText().toString());
intent.putExtra("tel",shouhuo_phone.getText().toString());
intent.putExtra("submitId", imagIdReturn);
intent.putExtra("bitmap1",imagBm1);
intent.putExtra("bitmap2",imagBm2);
intent.putExtra("bitmap3",imagBm3);
intent.putExtra("bitmap4",imagBm4);
// intent.putExtra("bitmap4",((BitmapDrawable)oldPhone_iv4.getDrawable()).getBitmap());
startActivity(intent);

activity2

 if(getIntent()!=null){
shouhuo_name.setText(getIntent().getStringExtra("name")+"");
shouhuo_address.setText(getIntent().getStringExtra("address")+"");
shouhuo_phone.setText(getIntent().getStringExtra("tel")+"");
submitIdNum=getIntent().getStringExtra("submitId");
byte[]imagBm1=getIntent().getByteArrayExtra("bitmap1");
byte[]imagBm2=getIntent().getByteArrayExtra("bitmap2");
byte[]imagBm3=getIntent().getByteArrayExtra("bitmap3");
byte[]imagBm4=getIntent().getByteArrayExtra("bitmap4");
oldPhone_iv.setImageBitmap(PicUtils.Bytes2Bimap(imagBm1));
oldPhone_iv2.setImageBitmap(PicUtils.Bytes2Bimap(imagBm2));
oldPhone_iv3.setImageBitmap(PicUtils.Bytes2Bimap(imagBm3));
oldPhone_iv4.setImageBitmap(PicUtils.Bytes2Bimap(imagBm4));

}

大功告成,出现问题找到原因之后就很快解决了~