http://blog.csdn.net/pingfangx/article/details/52093225
这个问题没找到官方说明,针对网上的各种答案,自己实际测试了一下。
0x01结论
1.1传512K以下的数据的数据可以正常传递。
1.2传512K~1024K的数据会出错,闪退。
1.3传1024K以上的数据会报错:TransactionTooLargeException。
1.4考虑到Intent还包括要启动的Activity等信息,实际可以传的数据略小于512K
0x02准备工作
2.1怎么查看占用内存大小
见参考文献1、2。
2.2构建要传的数据
①我们构建一个1K的字符串;
②再构建ArrayList的字符串列表;
③用Intent.putStringArrayListExtra传递
我们知道1个char占2个字节,那么构建一个512的字符串就刚好1K了。
实测的时候发现512占了1040,于是减掉8个,取504个。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2.3循环测试
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
2.4分析第509的时候闪退
当mArrayList的size是509的时候,就闪退了。
有以下两张图。
可以看到508的时候
522936/1024=510.68
509的时候
523960/1024=511.68
虽然还没有到512,但我还是得出512的结论,原因是Intent的其他内容也要占内存,所以诱发闪退的原因应该是512.
2.5循环查找TransactionTooLargeException下限
改下测试代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.6分析1018下限
1018的时候闪退,1019时捕获异常。
- 1
- 2
- 3
- 1
- 2
- 3
这个官方是有说明的,最在1M(见参考文献3),
上面的1039780/1024=1015.41,哈哈,不要在乎这些细节。
看下面2张图
1046536/1024=1022.01
1047560/1024=1023.01
0x03参考文献
[1]基于Android Studio的内存泄漏检测与解决全攻略
[2]使用新版Android Studio检测内存泄露和性能
[3]TransactionTooLargeException
[3]江湖问题研究– intent传递有没有大小限制,是多少?