在同一线程上调用新协程时如何取消旧协程

时间:2019-07-23 14:32:16

标签: android multithreading kotlin coroutine kotlin-coroutines

目前,我有这段代码。

如果用户停留在相同的分片上,我将从API中获得apiGetObject,并希望通过resetTime - current进行续订(请注意,该值将始终为3分钟)。

这段代码将needReload.value = true延迟了一段时间。

GlobalScope.launch(Dispatchers.Main) {
    apiGetObject.value?.resetTime?.let {
        if (it - System.currentTimeMillis() > 0) {
            delay(it - System.currentTimeMillis())
        }
    }
    needReload.value = true
}

现在,我在每个onResume上检索对象以刷新数据(这是必须的)。因此,如果在3分钟窗口内恢复“碎片”,则会启动另一个协程。

=>这样就可以制作数据

我想要什么:

我想如果有新的协程发射,那么前一个被取消/销毁。无论如何,有这种方法吗(欢迎使用此协程的其他解决方案)

注意:我将MVVM与LiveData结合使用,并且我获得了apiGetObject以及翻新和RX

1 个答案:

答案 0 :(得分:1)

要取消协程,可以保留启动协程时返回的'Job'对象的引用,当要停止该协程时,可以调用'job.cancel()'

就您而言,

首先为job创建一个全局变量

var job : Job? = null

以及启动协程时

job?.cancel()

job = GlobalScope.launch(Dispatchers.Main) {
    apiGetObject.value?.resetTime?.let {
        if (it - System.currentTimeMillis() > 0) {
            delay(it - System.currentTimeMillis())
        }
    }
    needReload.value = true
}

因此在这里,在启动协程之前,我们将取消前一个协程。