我想知道Android Bundle的数据大小是否有上限。我试图通过Bundle发布大小超过80k的数据,结果抛出了Android致命异常。这些数据是可序列化的。
这取决于Bundle的目的。Bundle本身仅受内存限制。
Bundle的两个主要用途是通过Intent在组件之间传递信息和保存Activity的状态。
当用于在Android组件之间传递信息时,Bundle将被序列化为Binder事务。进程中所有Binder事务的总大小为1MB。如果超过此限制,将收到致命错误“!!! FAILED BINDER TRANSACTION !!!”。
建议您将这些Bundle中的数据尽可能保持小,因为它是一个共享缓冲区,任何大于几千字节的数据都应该写入磁盘。
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状态的bundle中,我可以存储无限制的大小。我进行了一些测试,并成功地存储了约175MB的数据,然后尝试分配要保存的数据时遇到了内存不足异常。
更新:这项研究是在2014年进行的,Android的新版本可能会崩溃,如果Bundle超过500KB。
我认为限制是 500kb。 您可以将传递的对象保存在文件中,然后将文件路径保存在捆绑包中。 您可以查看我的类似问题,网址为SO。
我认为最大的捆绑大小是1024千字节。为了在活动之间传输大对象,您应该尝试其他方法(内存缓存、本地存储等)。
是的,它有1MB的限制。
您可以使用Singleton
类传递数据。
tooLargeDataException
异常,但不会出现在新设备上,因为它们使用的是较高的Android版本。 - pintu236