Я отправляю данные через трансляции следующим образом:
Intent outIntent = new Intent(Const.ACTION_FEED);
outIntent.putExtra(Const.EXTRA_FEED, data);
sendBroadcast(outIntent);
Проблема в том, что data
может стать довольно большим, что приведет к TransactionTooLargeException
. В документации говорится:
Буфер транзакций Binder имеет ограниченный фиксированный размер, в настоящее время 1 МБ, который используется всеми транзакциями, выполняемыми для процесса. Следовательно, это исключение может быть вызвано, когда выполняется много транзакций, даже если большинство отдельных транзакций имеют умеренный размер.
Итог: кажется, невозможно заранее сказать, какой размер приемлем для data
.
Более того:
Ключ к тому, чтобы избежать
TransactionTooLargeException
, заключается в том, чтобы все транзакции были относительно небольшими. [...] Если возможно, попробуйте разбить большие запросы на более мелкие части.
Природа данных, которые я отправляю, такова, что я могу легко разбить их на более мелкие части и отправить их по отдельности, как только я установил, что все это слишком велико для отправки за один раз.
Логичным шагом было бы обернуть весь код в блок try
/catch
, а при получении исключения TransactionTooLarge
разбить данные на более мелкие фрагменты и повторить попытку.
Увы, согласно logcat, исключение выбрасывается не на стороне вызывающей стороны, а в системном процессе. Затем система приводит к сбою получателя широковещательной рассылки, после чего любое восстановление выходит из-под контроля отправителя.
Как узнать, сколько данных можно отправить в качестве дополнительной рассылки, и предотвратить сбой получателя данных?
BroadcastReceiver
во время выполнения, чтобы он мог принимать неявные широковещательные сообщения. - person user149408   schedule 20.07.2019ContentProvider
является разумным выбором. В качестве бонуса вы можете защитить этого провайдера с разрешениемACCESS_FINE_LOCATION
, заодно решив проблему с разрешениями, поскольку сама трансляция только сUri
не будет содержать личных данных. - person CommonsWare   schedule 20.07.2019