我在kotlin的一个viewModel的初始化中启动了协程。协程侦听循环中的数据,一切正常,但作为标题sugguest,我无法取消该协程(或者也许viewmodel没有调用清除),因为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() (也尝试了片段)
发布于 2020-04-03 16:09:20
这应该可以解决您的问题,将作业分配给一个变量,然后使用它来取消。
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发布于 2021-06-06 03:07:57
协程中的取消必须是协作的。也就是说,你的代码应该检查协程状态。在套接字连接中,应该至少在调用任何回调时检查isActive或ensureActive(),然后才能继续操作。理想的解决方案是手动关闭套接字连接器,因为不能保证任何回调。将被调用。您也可以尝试使用suspendCancellableCoroutine
https://stackoverflow.com/questions/57748419
复制相似问题