有时候你用bundle传数据的时候会出现对象等过大,产生异常错误。也有可能调用系统裁剪图片也会有这个问题。。。
遇到了就觉得蛮常见的样子...
比如bundle传递数据网络数据给界面的时候:
image另一种就是系统相册相关类似问题....
解决方案:
1. 传递数据对象过大的情况:
方法一:最简单、最直接的办法,当然是让数据量变小了:
方法二:方法一转成字符串缩小后如果依然超过限制怎么办?不要认为这是不可思议的事情,
对于一些复杂的页面数据量超过1M很常见,那我们就直接把字符串写到本地文件中去,然后在接收的地方再读取文件就可以了。
(注意异步的使用,以及如何保证文件写完后再跳转到接收的地方)
方法三: Binder的缓冲区对数据大小的限制明显(不超过1M,而且是15个线程共享这块空间,实际上你操作的线程内,数据超过200K都可能挂掉),
那么干脆就换一个方式呗,直接用EventBus(或者自己用RxJava实现一个事件传递)就可以了。用EventBus的话,我们可以使用粘性事件,postStickyEvent,
然后在下一个Activity中接收(不要忘了最后的removeStickyEvent操作)
2. 相册相关的情况
裁减图片时传递的return-data设置为true,在onActivityResult的Intent中data的值会带一个Bitmap对象,
如果图片太大或者裁减图片目标尺寸过大,就会出现android.os.TransactionTooLargeException: data parcel size xx bytes错误,
因为Intent之前传递Parcel对象有大小限制。这个时候只能通过MediaStore.EXTRA_OUTPUT设置裁减图片保存位置,只传递图片路径,不直接传bitmap对象。
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");// mUri是已经选择的图片Uri
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);// 裁剪框比例
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", outputX);// 输出图片大小
intent.putExtra("outputY", outputY);
intent.putExtra("return-data", false);
intent.putExtra("noFaceDetection", true); // no face detection
intent.putExtra(MediaStore.EXTRA_OUTPUT, saveUri);
startActivityForResult(intent, requestCode);
网友评论