无法取消以viewModelScope

时间:2019-09-01 18:14:12

标签: android kotlin mvvm kotlin-coroutines android-viewmodel

我正在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提出的建议。

2 个答案:

答案 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)

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