[英]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
协程中的取消必须是合作的。 即您的代码应该检查协程状态。 在您的套接字连接中,您应该至少在调用任何回调之前检查isActive
或ensureActive()
,然后再继续进行。 理想的解决方案是手动关闭套接字连接器,因为不能保证任何回调。 将被调用。 您也可以尝试使用suspendCancellableCoroutine
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.