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

标签: activity intent 数据 | 发表时间:2015-08-12 19:40 | 作者:Rflyee
出处:http://blog.csdn.net

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. 持久化


参考:


作者:Rflyee 发表于2015/8/12 11:40:34 原文链接
阅读:137 评论:0 查看评论

相关 [activity intent 数据] 推荐:

activity、 intent 、intent filter、service、Broadcast、BroadcaseReceiver解释

- - CSDN博客推荐文章
Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(由系统控制生命周期,程序无法改变,但可以用onSaveInstanceState保存其状态). 对于Activity,关键是其生命周期的把握(如那张经典的生命周期图=.=),其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState),以及Activity之间的跳转和数据传输(intent).

使用intent来启动activity

- - CSDN博客推荐文章
Intent最常见的用途是绑定应用程序组件,并在应用程序之间通信.Intent用来启动Activity,允许创建不同屏幕的一个工作流. 要创建并显示一个Activity,可以调用startActivity,并传递给它一个Intent,如:. 可以构造Intent来显示地指定要打开的Activity类,或者包含一个目标Activity必须执行的动作.

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

- - CSDN博客推荐文章
转载请注明: 大飞  http://blog.csdn.net/rflyee/article/details/47441405. Activity之间使用Parcel传递大量数据产生的问题. Activity之间通过intent传递大量数据,导致新Activity无法启动. Activity之间数据传递方式总结参考  这 里.

Android 之 Activity和Intent用法介绍

- - 移动开发 - ITeye博客
                            Activity 生命周期. 1、 Activity介绍.         Activity 是Android应用程序和用户交互的窗口;.     2)  运行时的Activity特点:.         i.  可见的;. 2、 Activity的生命周期.

在Activity之间传递数据

- - ITeye博客
在一个Activity中启动另一个Activy,取得数据,如:在应用 A 中启动 通讯录,选择目标用户,返回,以便在A 中使用选择的通讯录数据,基本过程如下:.         /* 开启Pictures画面Type设定为image */.         intent.setType("image/*");  //通讯录的不能这样写,.

android不同Activity之间的数据共享

- - CSDN博客移动开发推荐文章
通过不同Activity之间的消息传递机制实现数据共享. 将需要共享的变量声明为public static类型. 新建Application的子类,在该类中声明共享的变量. 在AndroidManifest.xml的application加个name属性就可以了,如下面所示:. 作者:foreverkoking 发表于2013-2-21 17:04:41 原文链接.

Activity跳转的数据交换问题---学习笔记

- - CSDN博客推荐文章
问题一:有两个Activity(A和B),从A跳转到B,同时B需要A中的数据:. MainActivity类:. String sex = sex_rbtn.isChecked()?"男":"女";. //启动intent对应的Activity. SecondActivity类:. //获取启动该Result的Intent.

Android Intent调用大全、系统自带Intent调用大全

- - 移动开发 - ITeye博客
1.从google搜索内容 . 6.调用发短信的程序 . 9.发送Email . 10.播放多媒体 . 14.从gallery选取图片 . 16.显示应用详细列表 . 刚才找app id未果,结果发现用package name也可以 . 18.打开联系人列表 . 19.打开另一程序 . 需要添加 这个权限到androidmanifest.xml.

Android中隐式意图(Intent)用法

- - CSDN博客推荐文章
         Intent对象在Android应用开发中起到很大的作用,例如激活组件(Activity,Service 等组件)或者携带数据的功能,相信大家在开发中经常会用到这些功能,Android中的意图分为 显式意图和 隐式意图,显式意图大家应该用得比较多,但隐式意图在开发过程中也是必不可少的.

(转)intent 的URI功能示例总汇

- - 移动开发 - ITeye博客
一、打开一个网页,类别是Intent.ACTION_VIEW. 二、打开地图并定位到一个点. 三、打开拨号界面,类型是Intent.ACTION_DIAL. 四、直接拨打电话,与三不同的是,这个直接拨打电话,而不是打开拨号界面. 五、卸载一个应用,Intent的类别是Intent.ACTION_DELETE.