转载:大飞 http://blog.csdn.net/rflyee/article/details/47441405
Activity之间使用Parcel传递大量数据产生的问题。
Activity之间通过intent传递大量数据,导致新Activity无法启动。
Activity之间数据传递方式总结参考 这 里。
比较常用的是直接利用intent传递,比如使用bundle,如下:
Intent intent =new Intent(ActivityA.this,ActivityB.class);
Bundle bundle =new Bundle();
bundle.putParcelableArrayList("data", dataList);
intent.putExtras(bundle);
startActivity(intent);

问题:当传递数据量过大,比如list的size过大,会导致B无法启动。现象即启动失败,activityB的oncreate()都不会执行。
分析:
官方文档提到TransactionTooLargeException异常,“The Binder transaction failed because it was too large.”即传输数据过大异常。
并且提到这样一句话:“Parcel objects stored in the Binder transaction buffe”,这表明实际上底层parcel对象在不同activity直接传递过程中保存在一个叫做“ Binder transaction buffe”的地方,既然是缓冲区,肯定有大小限制。
官方文档还提到
“The Binder transaction buffer has a limited fixed size, currently 1Mb, which is shared by all transactions in progress for the process. Consequently this exception can be thrown when there are many transactions in progress even when most of the individual transactions are of moderate size.”
即缓冲区最大1MB,并且这是该进程中所有正在进行中的传输对象所公用的。至于都有哪些传输对象、具体怎么分配,这个还不太清楚。可以肯定的是Activity之间使用Parcel传输数据是有大小限制的。那么在传输大小可能很大的情况下就要做点处理了。
-------
另外,
该博客“Yet another post on Serializable vs Parcelable”中在对比Serializable和Parcel时提到以下两点数据,仅供参考了解,实际使用各有不同
1. 使用Serializable和parcel传输相同对象,都转换为byte[]后,parcel大概是serializable的20倍了。
2. 但是官方建议使用Parcel,原因是说速度是serializable的将近10倍。
Serializable: it's error prone and horribly slow. So in general: stay away from Serializable if possible. 
Parcelable: If you want to pass complex user-defined objects, take a look at the Parcelable interface. It's harder to implement, but it has considerable speed gains compared to Serializable.
但是有时候出现该问题时居然不报错(我遇到的就没抛异常),甚至没有特殊的log(adb logcat -v threadtime -s ActivityManager 、adb logcat -b events)
并没有像文章或者官方文档中提到的“ throwing a TransactionTooLargeException (or just logging E: !!! FAILED BINDER TRANSACTION !!! on pre 15 API levels)”
比较奇葩!

---------

针对parcel传递数据大小限制,自个儿做了个简单实验:
机型:Galaxy Nexus
系统:4.1.2  sdk16
过程:ActivityA,ActivityB,DataBean(每个对象大概200byte),A启动B并使用Parcel对象传递list<dataBean>。
当list大小为900个时,无法启动B。即传输数据大概在200*900 < 200k
所以按照官方解释,对于具体某一次Activity间传输的限制大小是不确定的,依据使用环境而定。
解决方法:
括弧,赶紧以下解决方案都不是很理想啊,,,
一. 限制传递数据量
二. 改变数据传输方式(参见Activity之间传递数据的方式)
1. 静态static
2. 单例
3. Application
4. 持久化

转载于:https://www.cnblogs.com/penghuster/p/5328062.html

Activity之间使用intent传递大量数据带来问题总结相关推荐

  1. Android学习备忘009——Activity之间用Intent传递数据

    前一个Activity Intent intent = new Intent(this,TwoActivity.class); intent.putExtra("name",&qu ...

  2. fragment与activity之间的信息传递的两种方式

    因为Fragment和Activity一样是具有生命周期,不是一般的bean通过构造函数传值,会造成异常. fragment与activity之间的信息传递的两种方式: 1.第一种方式,也是最常用的方 ...

  3. framework层加了打印信息打印intent传递的数据,报错:ActivityManager: Activity Manager Crash. UID:10074 PID:7444 TRANS:3

    最近有个项目,需要跳转到第三方应用展示影片详情页,通过打印信息,可以找到要跳转的activity的名称或action,但是利用这个activity跳转之后,该详情页的背景图始终显示不出来,是我少传了参 ...

  4. 关于Android中Intent传递Serialzilable数据的问题

    2019独角兽企业重金招聘Python工程师标准>>> 之前写程序,如果是队列数据的话,一般都是用ArrayList来作为存储介质,但是现在接手公司的新项目,因为之前这个公司是在wi ...

  5. Activity之间的信息传递

    1.上一个Activity向下一个Activity传递信息 1.FirstActivity(上一个)跳转到下一个SecondActivity(下一个) Intent intent = new Inte ...

  6. 求证 intent传递大数据限制

    实例1:传递一个大数据StringList import android.os.Bundle; import android.support.v7.app.AppCompatActivity; imp ...

  7. 安卓怎么实现两个activity之间图片的传递

    在MainActivity的OnCreate中写 `bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launch ...

  8. Android 开发中使用Intent传递数据的方法

    Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...

  9. intent传递较大数据的解决和intent不能传递较大数据的原因

    一.首先提供需要在activity之间用intent传递较大数据的方法.intent不能传递较大数据,需要传递数据的时候,写一个操作类: public class DataHelper {privat ...

最新文章

  1. 澳大利亚悉尼大学徐畅教授招收深度学习方向全奖博士生
  2. 让批处理文件(.bat)程序无窗口(隐藏/静默)运行
  3. sqoop2 mysql导入hdfs_Sqoop2入门之导入关系型数据库数据到HDFS上(sqoop2-1.99.4版本)
  4. ros开发语言python效率_Python 的开发效率真的比 Java高吗?
  5. 如何彻底搞懂面向 Web 开发者的正则表达式?
  6. vue 插值表达式,v-cloak,v-text,v-html,以及v-bind,v-on
  7. flash CS6 导入音频不成功的问题
  8. java 单例 内存释放_java 单例模式 防止内存泄漏
  9. 如何选择APP的推广渠道?
  10. java gis 矢量数据结构_2.4. 矢量数据结构
  11. 【NISP一级】3.2 防火墙
  12. 2020美赛赛后感想总结
  13. QT QML 与C++ 混合编程
  14. 什么是两化融合贯标?对企业有什么好处?
  15. 公司的技术团队负责人(团队管理),研发团队
  16. 优化算法中的零次优化详解
  17. python脚本之批量查询网站权重
  18. 无法定位程序输入点_invalid_parameter_noinfo_noreturn于动态链接库 MSVCR100.dll上
  19. 基于Python的文件操作之第1课读文件
  20. 递归算法的时间复杂度终结篇

热门文章

  1. manual php,PHP - Manual: 介绍 (官方文档)
  2. java五大原则_Java面向对象的三大特征和五大原则
  3. PHP 遇见 Serverless,帮你解决这些痛点
  4. 鉴机识变,面向未来|RocketMQ Summit 2022 即将来袭
  5. 用 Arthas 神器来诊断 HBase 异常进程
  6. linux命令gen,Linux中msgen命令起什么作用呢?
  7. 基于matlab的捷联惯导算法设计及仿真,基于 Matlab 的捷联惯导算法设计及仿真1doc.doc...
  8. html 元素怎么分类的,前端之Html元素的分类
  9. Pytorch Document学习笔记
  10. 【直播】回放与PPT下载!深度学习如何用于摄影图像的处理?