Как отменить job, который записывает данные в Firestore
Я недавно стал программировать в Android на Kotlin, и узнал о возможности избежать AddOnSuccessListener благодаря Kotlin coroutines и метода await(). И у меня есть следующий код
lateinit val job:Job
job = GlobalScope.launch(Dispatchers.IO) {
try {
withTimeout(50L) {
db.collection(collectionPath)
.document(doc.name).set(doc).await()
}
} catch (e: TimeoutCancellationException) {
Log.d("DEBUG",e.toString())
Log.d("DEBUG","isCancelled="+job.isCancelled.toString())
job.cancel("Cancelled")
Log.d("DEBUG","isCancelled="+job.isCancelled.toString())
withContext(Dispatchers.Main) {
Toast.makeText(
context,
"time out",
Toast.LENGTH_LONG
).show()
}
}
}
Особенность await() заключается в том, что он будет всё время пытаться выполнить set, пока ему это не удасться. Но я хотел бы реализовать timeout по наступлении которого метод await прекратил бы все попытки записи в базу. Для этого я устанавливают маленький интервал времени (50L), которого точно не достаточно для записи в базу, у меня прекрасно срабатывает TimeoutCancellationException, затем я делаю job.cancel в надежде, что это остановит await.
В логах я вижу: isCancelled=false - до вызова job.cancel isCancelled=true - после выполнения job.cancel То есть статус джобы меняется. Но это почему-то не останавливает await, и по истечении timeout запись в базу всё-таки происходит.
В документации я читал, что job.cancel не достаточно и в теле самой корутины нужно делать условие (job.isActive), но в моём случае это один метод await, и я в него никак не смогу вставить это условие. Хотя в интернете нашёл информацию, что await - это cancellable метод, который прекращает все попытки выполнить операцию, как только корутина, в которой он вызван, становится cancelled.
Подскажите, пожалуйста, если кто знает, как остановить await после timeout