Мне трудно понять, почему я наблюдаю 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 секунд для завершения