Google Fitness: работа с TransactionTooLargeException без обратной связи - PullRequest
1 голос
/ 19 апреля 2019

Я создаю приложение, интегрирующееся с Google Fit через локальный (не REST) ​​Google Fit API. Я использую Flutter 1.2.1, Kotlin 1.3.21, com.google.android.gms: play-services-fitness: 16.0.1 и запускаю приложение на Android 8.1.0 с помощью Google Play Services 16.0.89.

Некоторые запросы HistoryClient.readData () исчезают без обратной связи (без обращений к onSuccessListener, onCancelledListener, onFailureListener, onCompleteListener callbacks), и в это время я вижу в журналах:

   W/Fitness: Error delivering batch 0. Attempt #2
    android.os.TransactionTooLargeException: data parcel size 572360 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:777)
        at crb.c(:com.google.android.gms@16089017@16.0.89 (040306-239467275):1)
        at yek.a(Unknown Source:8)
        at yta.a(:com.google.android.gms@16089017@16.0.89 (040306-239467275):52)
        at yta.a(:com.google.android.gms@16089017@16.0.89 (040306-239467275):31)
        at ytc.run(:com.google.android.gms@16089017@16.0.89 (040306-239467275):44)
        at rrt.b(:com.google.android.gms@16089017@16.0.89 (040306-239467275):32)
        at rrt.run(:com.google.android.gms@16089017@16.0.89 (040306-239467275):21)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at rxx.run(Unknown Source:7)
        at java.lang.Thread.run(Thread.java:764)

Насколько я понимаю, либо местная служба Фитнес (часть Сервисов Google Play) не может отправить уведомление о сбое, либо клиентская библиотека в Google Fit, которую я использую, не может передать ее. Это правильно?

Как другие используют этот API для решения этой проблемы? Какой хороший период времени нужно просить, чтобы быть уверенным, что он будет успешно завершен на всех телефонах?

Примечание: я пытался опубликовать это как ошибку на https://issuetracker.google.com/issues/130402455,, но я не получил ответа, и я даже не уверен, было ли это подходящим местом для этого.

1 Ответ

1 голос
/ 23 апреля 2019

TransactionTooLargeException означает, что обмен данными между службами / приложениями любого рода превысил допустимый верхний предел данных Android. Обычно ограничение размера составляет около 200 КБ, но оно может варьироваться (и я не уверен на 100%).

Решение состоит в том, чтобы разделить запрашиваемые данные, просматривая API Google Fit. Я думаю, вы можете попытаться получить меньше данных за один раз, установив более короткий диапазон времени в DataRequest. В вашем случае ошибка говорит о том, что вы запрашиваете около 500 КБ данных, что означает, что вы можете попытаться сократить временной интервал вашего запроса примерно до половины.

Но даже тогда фактический размер данных может сильно различаться в зависимости от действий пользователя, и не рекомендуется многократно запрашивать слишком мало за раз, поэтому я думаю, что вы можете попытаться настроить таймер после вашего запроса, и если по прошествии некоторого времени данные не будут возвращены, уменьшите временной интервал запроса и повторите попытку (поскольку захват ошибки невозможен).

Другим подходом к обнаружению ошибки может быть чтение журналов в отдельном потоке, и если он перехватывает TransactionTooLargeException, он вызывает обратный вызов и уведомляет вас об уменьшении временного интервала запроса. Вы можете захватить журналы как это:

try {
  Process process = Runtime.getRuntime().exec("logcat *:S Fitness:W");//only show Google Fitness related logs
  BufferedReader bufferedReader = new BufferedReader(
  new InputStreamReader(process.getInputStream()));
  String line = "";
  while ((line = bufferedReader.readLine()) != null) {
     if(line.contains("Error delivering batch")){
        //do your callback here
     }
  }
  } 
catch (IOException e) {}

И, за исключением исключения, я бы сказал, что это ошибка на стороне Google, так как они не рассмотрели эту ситуацию и не уловили это исключение, и это был бы действительный отчет об ошибке.

...