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. 持久化
轉載于:https://www.cnblogs.com/penghuster/p/5328062.html
總結
以上是生活随笔為你收集整理的Activity之间使用intent传递大量数据带来问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS小技巧:用runtime 解决UI
- 下一篇: eclipse安装birt插件