Как отменить 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


Ответы (0 шт):