android - 如何防止 TransactionTooLargeException,或从中恢复
问题描述
我通过这样的广播发送数据:
Intent outIntent = new Intent(Const.ACTION_FEED);
outIntent.putExtra(Const.EXTRA_FEED, data);
sendBroadcast(outIntent);
问题是它data
会变得相当大,导致TransactionTooLargeException
. 文档说:
Binder 事务缓冲区有一个有限的固定大小,目前为 1Mb,由进程正在进行的所有事务共享。因此,当有许多事务正在进行时,即使大多数单个事务的大小适中,也可能会引发此异常。
底线:似乎不可能提前知道什么尺寸是可以接受的data
。
此外:
避免的关键
TransactionTooLargeException
是保持所有交易相对较小。[...] 如果可能,尝试将大请求分解成更小的部分。
我发送的数据的性质是这样的,一旦我确定整个数据太大而无法一次发送,我可以轻松地将其分解成更小的部分并单独发送。
合乎逻辑的步骤是将整个代码包装在try
/catch
块中,并在收到TransactionTooLarge
异常后,将数据分成更小的块并重试。
唉,根据logcat,异常不是在调用者端抛出,而是在系统进程中抛出。然后系统继续使广播的接收器崩溃,此时任何恢复都超出了发送者的控制。
我怎样才能知道有多少数据可以作为广播额外发送,并防止数据接收器崩溃?
解决方案
推荐阅读
- python - 得到“SyntaxError: Invalid Syntax”,但不知道为什么
- spring-boot - SpringBoot 2.1.3 首次认证的安全多重可用登录页面
- javascript - 为什么括号用于在元素的 onClick 标记内调用函数,而不是在元素的 onclick 属性中?
- java - JACOB - 对 COM 接口的远程调度调用
- android - 发送到本地 IP 地址时出现明文错误——Android 9
- c# - 使用 xsd.exe 从架构生成的类不包含枚举值
- c - 使用 C 中字符数组中的字符进行多线程读取/处理
- php - MySQL 数据库中的 IPN 和数据输入问题
- terraform - 当我添加到状态时,Terraform 想要销毁并创建新资源
- python - 有没有办法在一个别名下导入多个模块?