首页 > 代码库 > Activity之间使用intent传递大量数据带来问题总结
Activity之间使用intent传递大量数据带来问题总结
转载请注明:大飞 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. 持久化
转载请注明:大飞 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/
Activity之间使用intent传递大量数据带来问题总结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。