Android Intent传递大量数据出现问题解决
作者:AnRFDev 发布时间:2021-11-07 10:16:13
官方文档 https://developer.android.google.cn/guide/components/activities/parcelables-and-bundles
在sendBroadcast,startActivity时,我们会用到Intent。 Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化对象,Parcelable与Serializable。
异常TransactionTooLargeException
Intent传递数据时,如果数据太大,可能会出现异常TransactionTooLargeException。
注意:
在 Android 7.0(API 级别 24)或更高版本中,系统会在运行时抛出 TransactionTooLargeException 异常。在较低版本的 Android 中,系统仅在 logcat 中显示警告。
TransactionTooLargeException继承了RemoteException
package android.os;
public class TransactionTooLargeException extends RemoteException {
public TransactionTooLargeException() {
super();
}
public TransactionTooLargeException(String msg) {
super(msg);
}
}
追踪到Binder,它的transactNative方法会报出RemoteException
public native boolean transactNative(int code, Parcel data, Parcel reply,
int flags) throws RemoteException;
抛出异常与Binder有关。
通过 intent 发送数据时,应小心地将数据大小限制为几 KB。发送过多数据会导致系统抛出 TransactionTooLargeException 异常。
Intent携带信息的大小受Binder限制
Intent携带信息的大小其实是受Binder限制。本文标题也可以改为“Binder传递数据大小限制”。
数据以Parcel对象的形式存放在Binder传递缓存中。 如果数据或返回值比传递buffer大,则此次传递调用失败并抛出TransactionTooLargeException异常。
Binder事务缓冲区有一个限定大小,通常是1Mb。由进程中正在处理的所有事务共享缓存空间。
由于此限制是进程级别而不是 Activity 级别的限制,因此这些事务包括应用中的所有 binder 事务,例如 onSaveInstanceState,startActivity 以及与系统的任何互动。超过大小限制时,将引发 TransactionTooLargeException。
对于 savedInstanceState 的具体情况,应将数据量保持在较小的规模,因为只要用户可以返回到该 Activity,系统进程就需要保留所提供的数据(即使 Activity 的进程已终止)。我们建议您将保存的状态保持在 50k 数据以下。
为什么Binder要限制传输数据的大小
个人推测,作为一种IPC的方式,Binder并不是为传输大量数据而设计。
替代方案
当需要传递长字符串、Bitmap等时,不要考虑使用Intent传递数据的方案
1、单例
2、EventBus
3、Application
4、持久化数据
来源:https://juejin.cn/post/7067846053042585637
猜你喜欢
- RetrofitA type-safe HTTP client for Android and Java 适用于Java和Android的安
- 前言老师要求我们学生做一套拍照身份验证系统,经过长时间的学习,有了这篇文章,希望能帮到读者们。正文首先介绍本文的主角:AForge创建一个C
- 在使用spring boot进行打包的时候出现了一些问题,不是说找不到主类,就是说spring初始化时有些类没有加载。下面介绍一下如何解决。
- 目录一、二叉树的顺序存储1.堆的存储方式2.下标关系二、堆(heap)1.概念2.大/小 根堆2.1小根堆2.2大根堆3.建堆操作3.1向下
- 本文实例讲述了Java Base64算法实际应用之邮件发送。分享给大家供大家参考,具体如下:一 利用telnet和Base64来实现收发邮件
- 话不多说直接上代码,简单明了import java.io.File;import java.io.FileInputStream;impor
- 问题我需要从一个java的集合中,根据另一个集合的内容,删除第一个集合中不特定的元素。这看上去非常简单,但却遇到了问题。这是我要写的方法的头
- OAuth 简介OAuth 是由 Blaine Cook、Chris Messina、Larry Halff 及 David Recordo
- 问题描述输入一个链表,输出该链表中倒数第k个结点。(尾结点是倒数第一个)结点定义如下:public class ListNode { &nb
- 单例类保证一个类全局仅有一个实例,并提供一个全局访问点,由于只能生成一个实例,因此我们必须把构造函数设为私有函数以禁止他人创建实例。实现1:
- 很多时候忘记Android摄像头如何打开,查看google文档的话,发现太复杂(只是单纯的想打开摄像头而已,不想添加那么多设置,添加那么功能
- 1. 建立一个实现Filter接口的类所有过滤器都必须实现javax.servlet.Filter。这个接口包含三个方法,分别为doFilt
- 1.可能是缓存导致的。解决方法:清除缓存!2.全局编译可能项目依赖别的模块,别的模块修改未进行编译,这时须先对依赖模块进行编译补充知识:ID
- 本文实例为大家分享了Java Socket聊天室功能的具体代码,供大家参考,具体内容如下Client.javaimport java.io.
- Java jar打包成exe应用程序,可在无JDK/JRE环境下运行老师让做一个小项目,但是需要打包发布出来,因此在网上查了很多资料之后总结
- 本文实例讲述了C#数字图像处理之图像缩放的方法。分享给大家供大家参考。具体如下://定义图像缩放函数private static Bitma
- 前言jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕。而jd
- 传播行为定义关于客户端和被调用方法的事务边界。Spring定义了7种截然不同的传播行为。1,PROPAGATION_MANDATORY,表示
- java Lock接口java.util.concurrent.locks接口Lockpublic interface Loce
- 1 关于自动内存管理Java是由jvm来管理内存,包括自动分配以及自动回收,因此它不容易出现内存泄漏和内存溢出问题。C/C++,由程序员手动