繁体   English   中英

无法取消以 viewModelScope 启动的协程

[英]Unable to cancel coroutine started with viewModelScope

我正在 kotlin 中的 viewModel init 中启动协程。 协程在循环中侦听数据,一切正常,但正如标题所暗示的那样,我无法取消该协程(或者视图模型可能没有调用清除),因为 socked 保持连接。

// 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() (也尝试了一个片段)

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

    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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM