转载请注明:大飞 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 当list大小为900个时,无法启动B。即传输数据大概在200*900 < 200k 所以按照官方解释,对于具体某一次Activity间传输的限制大小是不确定的,依据使用环境而定。
解决方法: 一. 限制传递数据量 二. 改变数据传输方式(参见 Activity之间传递数据的方式) 1. 静态static 2. 单例 3. Application 4. 持久化
转载请注明: 大飞  http://blog.csdn.net/rflyee/article/details/47441405

参考: http://stackoverflow.com/questions/12819617/issue-passing-large-data-to-second-activity http://nemanjakovacevic.net/blog/english/2015/03/24/yet-another-post-on-serializable-vs-parcelable/



更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. iOS开发之初识UITableView
  4. SQLite操作
  5. android: 内容提供器简介
  6. Android原始视频格式YUV,NV12,NV21,YV12,YU12(I420)
  7. Android(安卓)SQLiteOpenHelper的使用
  8. Android之MVVM架构指南(五):ViewModel
  9. 《第一行代码》 6.3 SharedPreferences存储

随机推荐

  1. Android响应式布局
  2. 工作不久的安卓开发者,他们是这样规划自己
  3. Android系统显示原理
  4. [Android]开发摇一摇分歧表决器过程
  5. Android(安卓)IPC编程简介
  6. Android应用程序UI硬件加速渲染技术简要
  7. fir.im Weekly - iOS / Android(安卓)动
  8. onTouchEvent, onClick及onLongClick的调
  9. AIDL --- Android中的远程接口
  10. android 设置控件的透明度