首页 > 解决方案 > 如何防止 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,异常不是在调用者端抛出,而是在系统进程中抛出。然后系统继续使广播的接收器崩溃,此时任何恢复都超出了发送者的控制。

我怎样才能知道有多少数据可以作为广播额外发送,并防止数据接收器崩溃?

标签: androidbroadcastreceiverandroid-broadcastandroid-binder

解决方案


推荐阅读