intent传递数据太大,报TransactionTooLargeException异常

Intent数据过大解决方案
本文介绍了当Intent传输数据量过大时的两种解决策略:一是通过静态类或静态属性传递信息;二是利用本地存储如SP存储来存取数据。两种方法各有优劣,前者简单但可能增加代码耦合度,后者虽效率较低却能保持良好的模块独立性。

这里写图片描述
报错原因:intent传输数据太大。
解决方法有二:
第一:将传递的信息封装在一个静态的类中,或则封装在跳转对象的一个静态属性中,效率高,但是耦合性也高!(这种方法在stackoverflow网站看到的,有兴趣可以点击查看详情)

 Intent intent = new Intent(this,SecondActivity.class);
 DataSave.setValue(value);//将value设置到静态类DataSave中
 //SecondActivity.value = value;//或则将value设置到SecondActivity的静态属性中
 startActivity(intent);

第二:将传递的信息做本地存储,如SP存储、数据库等,然后在跳转对象中取出来,不会提高程序的耦合性,但是效率较低。

相对于数据库而言,个人比较喜欢sp存储,因为比较简单。
1、存储基本类型这个不多说
2、存储实体类,首先可以使用Gson将实体转为json串(可以使用new Gson().toJson()方法),然后进行存储,最后在跳转对象中取出再利用Gson转为实体即可(可以使用new Gson().fromJson()方法)。

总的来说,第一种方法简单一些!

<think>好的,我现在要帮用户了解AndroidIntent如何传递参数。首先,用户的问题很明确,但作为新手,可能需要详细的步骤和示例。先回忆一下自己学过的知识,或者查资料确认正确性。 记得Intent传递参数主要用putExtra方法,可以传基本类型、字符串、数组等。比如用户提到的引用[1]和[4]中有示例代码,发送方用putExtra,接收方用getXXXExtra。另外,Bundle对象也可以用来打包数据,尤其是当需要传递多个参数时,可以用Bundle来组织,然后通过Intent传递Bundle。引用[4]提到Bundle的putSerializable和putParcelable方法,用于传递对象,这点需要注意,可能需要对象实现Serializable或Parcelable接口。 用户提供的引用中有多个例子,比如发送Activity的代码intent.putExtra("key","A》B页面"),接收方用getStringExtra。还有引用[4]中的两种方式传递对象,这可能涉及到复杂对象的传递,需要详细说明。 首先,我应该分步骤讲解,先讲基本类型,再讲Bundle,再讲对象。每个步骤给出代码示例,这样用户更容易理解。同时需要指出不同方法的适用场景,比如基本类型适合简单数据,Bundle适合多个数据,而Serializable和Parcelable适合对象。 另外,需要注意一些常见错误,比如接收方使用的key要和发送方一致,否则取不到数据。比如引用[1]中的接收方代码里,key后面有个空格,可能是笔误,应该提醒用户注意key的一致性。 还要提到Intent传递数据的大小限制,比如引用[1]提到的传递参数的大小限制,如果数据太大可能会引发问题,这时候应该考虑其他方法,比如全局变量或者持久化存储。 最后,生成相关问题的时候,可以包括传递对象的方法、数据大小限制、Bundle的使用等,帮助用户扩展知识。</think>### Android Intent 传递参数方法详解 IntentAndroid 中用于组件间通信,支持多种参数传递方式,具体方法如下: --- #### **1. 基本数据类型传递** 通过 `putExtra()` 方法直接传递**基本类型**或**字符串**,接收方通过 `getXXXExtra()` 获取。 - **发送方代码示例**: ```java Intent intent = new Intent(CurrentActivity.this, TargetActivity.class); intent.putExtra("name", "张三"); intent.putExtra("age", 25); startActivity(intent); ``` - **接收方代码示例**: ```java Intent intent = getIntent(); String name = intent.getStringExtra("name"); // key需完全一致 int age = intent.getIntExtra("age", 0); // 默认值0 ``` --- #### **2. 使用Bundle打包数据** 通过 `Bundle` 对象传递**多个参数**,适合复杂场景[^4]。 - **发送方代码示例**: ```java Bundle bundle = new Bundle(); bundle.putString("address", "北京"); bundle.putDouble("score", 95.5); Intent intent = new Intent(this, TargetActivity.class); intent.putExtras(bundle); startActivity(intent); ``` - **接收方代码示例**: ```java Bundle bundle = getIntent().getExtras(); String address = bundle.getString("address"); double score = bundle.getDouble("score"); ``` --- #### **3. 传递可序列化对象** 需对象实现 `Serializable` 或 `Parcelable` 接口[^4]。 - **发送方代码示例**: ```java // 实现Serializable的User类 User user = new User("李四", 30); intent.putExtra("user_data", user); ``` - **接收方代码示例**: ```java User user = (User) getIntent().getSerializableExtra("user_data"); ``` --- #### **4. 注意事项** - **Key一致性**:发送方和接收方的 key 必须完全匹配(包括大小写)[^1]。 - **数据大小限制**:Intent 传递数据建议不超过 1MB,否则可能触发 `TransactionTooLargeException`[^1]。 - **对象序列化选择**:`Parcelable` 性能优于 `Serializable`,推荐优先使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值