我正在kotlin中的viewModel的init内部启动协程。 Coroutine循环侦听数据,一切正常,但由于标题建议,我无法取消袜子,保持连接的协程(或未调用viewmodel清除)。
// 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()(也尝试了一个片段)
已解决:问题是杰克逊流式API,它只在乎套接字是否关闭,否则会忙于从套接字读取json。 感谢@CommonsWare提出的建议。
答案 0 :(得分:0)
这应该可以解决您的问题,将作业分配给变量,然后使用它来取消。
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
答案 1 :(得分:0)
协程中的取消必须是合作的。即您的代码应该检查协程状态。
在您的套接字连接中,您应该检查 isActive
或 ensureActive()
至少在继续进行之前调用任何回调时。
理想的解决方案是手动关闭套接字连接器,因为不能保证任何回调。将被调用。你也可以试试 suspendCancellableCoroutine