如何在Kotlin中取消withContext

j2cgzkjk  于 2022-12-19  发布在  Kotlin
关注(0)|答案(1)|浏览(207)

我在里面有一个函数,我在特定时间触发一个事件。

fun startTimeWarning() {
     viewModelScope.launch {
        withContext(Dispatchers.Default) {
            if (!isActive) {
                delay(2000)
                // trigger event
            }
        }
     }
}

现在我想在cancelTimeWarning中触发新事件,并确保startTimeWarning未处于活动状态。是否可以在withContext中取消?

fun cancelTimeWarning() {
     viewModelScope.launch {
           // new event trigger
     }
}

我登记了这个answer,但我不认为它会帮助我。非常感谢

zf9nrax1

zf9nrax11#

这并不是说你想不想使用JobviewModelScope.launch会返回一个协程作业,这样你就可以使用这个引用在你的情况下手动取消它。

private var timeWarningJob: Job? = null
...
fun startTimeWarning() {
     timeWarningJob = viewModelScope.launch {
        withContext(Dispatchers.Default) {
            if (!isActive) {
                delay(2000)
                // trigger event
            }
        }
     }
}

fun cancelTimeWarning() {
    timeWarningJob?.cancel() // Cancel your last job
    viewModelScope.launch {
          // new event trigger
    }
}

编辑:
如果您的主管禁止您使用Job,您可以定义自己的上下文,并在以后取消它,就像上面一样。

private val timeWarningContext:CoroutineContext = Dispathers.Default
...
fun startTimeWarning() {
     viewModelScope.launch {
        withContext(timeWarningContext) {
            if (!isActive) {
                delay(2000)
                // trigger event
            }
        }
     }
}

fun cancelTimeWarning() {
    timeWarningContext.cancel() // Cancel your last job
    viewModelScope.launch {
          // new event trigger
    }
}

相关问题