Android Прерывание сопрограмм в SyncAdapter - PullRequest
0 голосов
/ 27 апреля 2020

Мне трудно понять, почему я наблюдаю InterruptedException с в методе SyncAdapter#onPerformSync.

Краткое вступление

Мой проект изначально содержал только код Java и был реализован рабочий шаблон SyncAdapter . В методе onPerfromSync я выполнял следующие операции для каждого ресурса, который мне нужно было синхронизировать c:

  • запрашивать локальную базу данных sqlite
  • отправлять данные на веб-сервер по HTTP
  • сохранение данных в локальной базе данных sqlite

По мере развития проекта я представил Kotlin и сопрограммы и решил использовать их в SyncAdapter. Большая часть ресурсов сохранила существующий лог c, и для некоторых я решил использовать сопрограммы. Мне пришлось соединить метод onPerformSync с CoroutineScope, чтобы я мог запускать сопрограммы. После этого я начал наблюдать InterruptedException s происходящих.

Код до (без исключений)

class MySyncAdapter extends AbstractThreadedSyncAdapter {
   ...

   @Override
   public void onPerformSync(...) {
       syncResourceX();
       syncResourceY();
   }

   private void syncResourceX() {
      // query db
      // send to server
      // store locally
   }
}

Код после (с исключениями)

class MySyncAdapter(...): AbstractThreadedSyncAdapter(...) {
   ...

   override fun onPerformSync(...) {
      runBlocking {
              syncResourceX();
              syncResourceY();
      }
   }

   private suspend fun syncResourceX() {
      // query db
      // send to server
      // store locally
   }
}

После этого рефакторинг Я начал получать InterruptedExceptions, где вызывается runBlocking.

Первоначально я думал, что это может быть связано с не выполнением сетевых операций в текущем потоке, поскольку документы состояния адаптера syn c, которые контролирует система сетевой трафик c и может прервать процесс syn c, если не генерируется трафик c. Но runBlocking должен вызывать выполнение любых сетевых запросов в текущем потоке, верно?

После чего я начал думать, что этот процесс существует и в коде Java. Просто нечего сообщать о прерывании процесса syn c. До тех пор, пока я не начал использовать сопрограммы и runBlocking, эта проблема показала себя сама. Или теперь я думаю.

Вопрос:

Любые мысли или объяснения, почему я ранее не наблюдал InterruptedException с кодом Java и наблюдаю InterruptedException с кодом Kotlin, превышает добро пожаловать.

Примечания

  • Я не переопределил onSyncCanceled
  • Процесс syn c обычно занимает менее 20 секунд для завершения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...