-
Notifications
You must be signed in to change notification settings - Fork 779
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2019-09-20:Intent传输数据的大小有限制吗?如何解决? #151
Comments
有限制,1M左右,不同机型大小不同,要问怎么解决,那就是不用(* ̄rǒ ̄) |
Intent传输数据的大小受Binder的限制,上限是1M。不过这个1M并不是安全的上限,Binder可能在处理别的工作,安全上限是多少这个在不同的机型上也不一样。 传 512K 以下的数据的数据可以正常传递。 解决办法
|
有,限制大约是1M左右,这个限制是binder底层的限制,因为binder本来就没有设计成传输大量数据的 |
Intent 中的 Bundle 是使用 Binder 机制进行数据传送的, 数据会写到内核空间, Binder 缓冲区域;
因为 Binder 本身就是为了进程间频繁-灵活的通信所设计的, 并不是为了拷贝大量数据; 我以前回答过类似的问题 |
有限制,一般是 1M,ROM厂商可以修改这个值,但是实际传输上要低于 1M ,因为 intent 一般还要承担其他责任,会占用一部分空间。 |
先说结论:有大小限制 再说原因:Intent 是消息传递对象,用于各组件间通信。各组件以及个程序间通信都用到了进程间通信。因此 Intent 的数据传递是基于 Binder 的,Intent 中的数据会存储在 Bundle 中,然后 IPC 过程中会将各个数据以 Parcel 的形式存储在 Binder 的事物缓冲区(Binder transaction buffer)进程传递,而 Binder 的事物缓冲区有个固定的大小,大小在 1M 附近。因为这 1M 大小是当前进程共享的,Intent 中也会带有其他相关的必要信息,所以实际使用中比这个数字要小很多。 解决方式:
|
flying-pigeon 匿名内存 |
平时我们在 Android 组件之间传递数据一般使用Intent都能解决,但是在传递的数据较大时(比如一个size>1000的列表),Intent就不能用了,如果非要用的话就会崩溃:TransactionTooLargeException。Intent 无法传递大数据是因为其内部使用了 Binder 通信机制,Binder 事务缓冲区限制了传递数据的大小。Binder 事务缓冲区的大小限定在 1MB,但是这个尺寸是共享的,也就是并不是传递 1MB 以下的数据就绝对安全,要视当前的环境而定。 不要挑战 Intent 传递数据大小的极限,对于大数据,例如长字符串、Bitmap 等,不要考虑 Intent 传递数据的方案。下面介绍几种解决方案。 使用单例 public class MusicListHolder { private ArrayList musicInfoList; public ArrayList getMusicInfoList() { return musicInfoList; } public void setMusicInfoList(ArrayList musicInfoList) { this.musicInfoList = musicInfoList; } private static final MusicListHolder holder = new MusicListHolder(); public static MusicListHolder getInstance() { return holder; } } 使用EventBus 使用 Application 有时候因为内存不足等原因,我们的应用会被系统强制杀死,此时再次点击进入应用时,系统会直接进入被杀死前的那个界面。但是此时Application却是新创建的,我们也就无法拿到之前存取的数据,如果不加以判断,则会导致空对象的问题。 使用建议: 使用时一定要做好非空判断 优点: 应用中所有地方都可以访问 操作麻烦 |
Intent的上限是1M |
通过putBinder的方式,利用共享内存 |
No description provided.
The text was updated successfully, but these errors were encountered: