首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一线程上调用新的协同线时如何取消旧的协同

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

Stack Overflow用户
提问于 2019-07-23 14:32:16
回答 1查看 2.9K关注 0票数 5

目前我有这段代码。

如果用户停留在同一个片段上,我将从API中获得apiGetObject,并希望用resetTime - current来更新它(请注意,这个值将始终为3分钟)。

此代码将needReload.value = true延迟了那么长的时间。

代码语言:javascript
复制
GlobalScope.launch(Dispatchers.Main) {
    apiGetObject.value?.resetTime?.let {
        if (it - System.currentTimeMillis() > 0) {
            delay(it - System.currentTimeMillis())
        }
    }
    needReload.value = true
}

现在,我在每个onResume上检索对象来刷新数据(这是必须的)。因此,如果碎片在3分钟窗口下被恢复,另一个协同线将被发射。

=> --这使得数据

我想要的:

我想,如果有一个新的协同线发射,那么前一个是取消/摧毁。是否有这样做的(其他解决方案,这个协同线是受欢迎的)

注意:我在LiveData中使用MVVM,我得到了带有Retrofit和RX的apiGetObject

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-24 09:22:11

为了取消一个协同线,您可以在启动coroutine时保留返回的'Job‘对象的引用,并且当您想停止该协同线时,您可以调用'job.cancel()’

在你的情况下

首先为作业创建一个全局变量

代码语言:javascript
复制
var job : Job? = null

当你发射协同线的时候

代码语言:javascript
复制
job?.cancel()

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

因此,在启动协同线之前,如果存在,我们将取消前一个协同线。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57166494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档