首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法取消使用viewModelScope启动的协程

无法取消使用viewModelScope启动的协程
EN

Stack Overflow用户
提问于 2019-09-02 02:14:13
回答 2查看 1.1K关注 0票数 0

我在kotlin的一个viewModel的初始化中启动了协程。协程侦听循环中的数据,一切正常,但作为标题sugguest,我无法取消该协程(或者也许viewmodel没有调用清除),因为socked保持连接。

代码语言:javascript
运行
复制
// viewmodel
init {
    viewModelScope.launch {
        connector()
    }
}

override fun onCleared() {
    viewModelScope.cancel()
    super.onCleared()
}

suspend fun connector() = withContext(Dispatchers.IO){
    //val socket : Socket
    try {
             // connect socket
             // listen in loop
    } catch (Exception e){//whocares}

已尝试在取消按下的活动上调用finish() (也尝试了片段)

EN

回答 2

Stack Overflow用户

发布于 2020-04-03 16:09:20

这应该可以解决您的问题,将作业分配给一个变量,然后使用它来取消。

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

    // viewmodel
    init {
        job = viewModelScope.launch {
            connector()
        }
    }

    override fun onCleared() {
        job?.cancel()
        super.onCleared()
    }

    suspend fun connector() = withContext(Dispatchers.IO){
        //val socket : Socket
        try {
                 // connect socket
                 // listen in loop
        } ca
票数 0
EN

Stack Overflow用户

发布于 2021-06-06 03:07:57

协程中的取消必须是协作的。也就是说,你的代码应该检查协程状态。在套接字连接中,应该至少在调用任何回调时检查isActiveensureActive(),然后才能继续操作。理想的解决方案是手动关闭套接字连接器,因为不能保证任何回调。将被调用。您也可以尝试使用suspendCancellableCoroutine

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

https://stackoverflow.com/questions/57748419

复制
相关文章

相似问题

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