Может ли обработчик с большим msg.obj вызвать исключение TransactionTooLargeException? - PullRequest
0 голосов
/ 06 февраля 2020

Я заметил, что в консоли Google зарегистрировано много исключений:

java.lang.RuntimeException: 
  at android.app.servertransaction.PendingTransactionActions$StopInfo.run (PendingTransactionActions.java:160)
  at android.os.Handler.handleCallback (Handler.java:873)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:201)
  at android.app.ActivityThread.main (ActivityThread.java:6815)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:547)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:873)
Caused by: android.os.TransactionTooLargeException: 
  at android.os.BinderProxy.transactNative (BinderProxy.java)
  at android.os.BinderProxy.transact (BinderProxy.java:1131)
  at android.app.IActivityManager$Stub$Proxy.activityStopped (IActivityManager.java:3973)
  at android.app.servertransaction.PendingTransactionActions$StopInfo.run (PendingTransactionActions.java:144)
  at android.os.Handler.handleCallback (Handler.java:873)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:201)
  at android.app.ActivityThread.main (ActivityThread.java:6815)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:547)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:873)

Я пытаюсь выяснить, что вызывает это исключение, но я не могу. Единственное подозрительное, что у меня есть в исходном коде, - это часть, в которой я загружаю очень большой файл json (7 МБ), анализирую его на модели (data объект) с GSON и передаю его через обработчик в мою деятельность:

Message msg = new Message();
msg.what = Util.THREAD_DATA_GENERATED;
msg.obj = data;
handler.sendMessage(msg);

. , .

notifyHandler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        Data data = (Data) msg.obj;
        Manager.getInstance().setData(data);
        showSelectTeamDialog();
        return true;
    }
});

Может ли этот обработчик вызвать это исключение при передаче параметра msg.obj с большим размером?

1 Ответ

0 голосов
/ 06 февраля 2020

Обработчик не будет. Но отправка этих данных через намерение в действие может. Данные сериализуются для возможного межпроцессного обмена сообщениями, и существует ограничение размера данных (когда-то это было 2 МБ, не уверен, изменилось ли это). Могу поспорить, что showSelectTeamDialog запускает Activity для показа диалога, и это то, что не получается.

Посмотрите на трассировку стека. Он включал:

в android .app.IActivityManager $ Stub $ Proxy.activityStopped (IActivityManager. java: 3973)

Так что действие по какой-то причине было остановлено. Единственная причина, по которой это произойдет, заключается в том, что вызывается fini sh или если запущено другое действие. Так что мы определенно видим слишком много данных в Намерении здесь.

...