在Android中页面间传递数据的时候可能会导致
下面这个错误
giving up android.os.TransactionTooLargeException: data parcel size 601332 bytes
这个是因为intent传递传输数据的时候有个大小限制,默认好像是1MB,具体可以参考官方文档
https://developer.android.com/reference/android/os/TransactionTooLargeException.html
无论我们是用Parcelable
或Serializable
还是Bundle
都无法解决这个问题
那么我们可以通过几种办法:
- 使用Parcelable或Serializable代替Bundle传递数据。这两种方式可以将对象序列化为字节数组,然后在Activity之间传递。虽然这种方式可能会增加一些开销,但可以传递更大的数据。
- 将数据存储在本地文件或数据库中,然后在Activity之间传递文件路径或数据库ID。
- 使用ContentProvider来共享数据。ContentProvider是一种Android组件,可以让应用程序共享数据。通过ContentProvider,可以在Activity之间传递大量的数据。
- Binder进程通信
前面几个不说了,我们着重说下Binder解决方案,较为高效快速简单
新建DataBinder
类继承android.os.Binder
public class DataBinder extends Binder {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
至于上面data你想用String
、byte
等等都可以不重要
下面使用它,加入A页面回传到B页面
在A页面中
DataBinder dataBinder = new DataBinder();
dataBinder.setData(这里写你的数据);
Bundle bundle = new Bundle();
bundle.putBinder(你的key, dataBinder);
setResult(RESULT_OK, getIntent().putExtras(bundle));
finish();
B页面中获取
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() != RESULT_OK) {
return;
}
if (result.getData() == null || result.getData().getExtras() == null) {
return;
}
Bundle bundle = result.getData().getExtras();
DataBinder dataBinder = (DataBinder) bundle.getBinder(你的key);
if (dataBinder == null) {
return;
}
...这里写你后面的解析数据等等操作
});
好了,问题解决了!!!