【发布时间】:2011-12-18 14:53:22
【问题描述】:
我想知道android bundle的数据大小是否有上限。我尝试通过大小 >80k 的捆绑包发布数据,并抛出 android 致命异常。数据是可序列化的。
【问题讨论】:
我想知道android bundle的数据大小是否有上限。我尝试通过大小 >80k 的捆绑包发布数据,并抛出 android 致命异常。数据是可序列化的。
【问题讨论】:
这取决于捆绑的目的。捆绑包本身仅受内存量的限制。
bundle 的两个主要用途是使用意图在组件之间传递信息以及保存活动的状态。
当用于在 Android 组件之间传递信息时,bundle 被序列化为一个 binder 事务。一个进程中所有 binder 事务的总大小为 1MB。如果超出此限制,您将收到此致命错误“!!! FAILED BINDER TRANSACTION !!!”
建议您将这些捆绑包中的数据尽可能小,因为它是一个共享缓冲区,任何超过几千字节的数据都应该写入磁盘。
ALOGE("!!! FAILED BINDER TRANSACTION !!!");
// TransactionTooLargeException is a checked exception, only throw from certain methods.
// FIXME: Transaction too large is the most common reason for FAILED_TRANSACTION
// but it is not the only one. The Binder driver can return BR_FAILED_REPLY
// for other reasons also, such as if the transaction is malformed or
// refers to an FD that has been closed. We should change the driver
// to enable us to distinguish these cases in the future.
参考:http://developer.android.com/reference/android/os/TransactionTooLargeException.html
Binder 事务缓冲区有一个有限的固定大小,目前为 1Mb,由进程正在进行的所有事务共享。因此,当有许多事务正在进行时,即使大多数单个事务的大小适中,也可能会引发此异常。
我发现用于保存 Activity 状态的包中可以存储的大小没有限制。在我收到内存不足异常尝试分配我试图保存的数据之前,我做了一些测试并且可以成功存储大约 175mb。
更新:这项研究是在 2014 年进行的,较新版本的 Android 可能会在捆绑包超过 500kb 时崩溃
【讨论】:
我认为限制是 500kb。 您可以将传递的对象保存在文件中,并在包中发送文件的路径。 您可以在SO查看我提出的类似问题
【讨论】:
Binder 事务缓冲区有一个有限的固定大小,目前 1MB,由进程中所有正在进行的事务共享。由于此限制是在进程级别而不是在每个活动级别,因此这些事务包括应用程序中的所有绑定事务,例如 onSaveInstanceState、startActivity 以及与系统的任何交互。当超出大小限制时,会抛出 TransactionTooLargeException。
对于 savedInstanceState 的特定情况,数据量应该保持较小,因为只要用户可以导航回该活动,系统进程就需要保留提供的数据(即使活动的进程是被杀)。我们建议将保存状态保持在少于 50k 的数据。
【讨论】:
是的,现在在 android Nougat 中,如果您大致超过限制 (500Kb),它将崩溃。
【讨论】:
根据Google Android API,日期应该小于50K。
【讨论】:
是的,它有 1MB 的限制。
你可以使用Singleton类来传递数据。
【讨论】:
我认为最大包大小为 1024 千字节。为了在活动之间传输大对象,您应该尝试其他方式(内存缓存、本地存储等)。
【讨论】: