我如何在CoroutineScope内取消并检测取消

时间:2019-06-18 09:00:11

标签: android kotlin kotlin-coroutines

从CoroutineScope检测取消

我正在尝试从CoroutineScope中检测到取消,但是当我尝试在CoroutineScope中调用cancel方法时,isCancelled属性没有改变

我希望从ViewModel取消协程的方法

fun login() = viewModelScope.launch{
        try{
            repository.login(emailLogin.get()!!, passwordLogin.get()!!)
        }catch (e: AuthenticationHttpErrorException){
            cancel(CancellationException(e.message))
            Toast.makeText(getApplication(),e.message, Toast.LENGTH_SHORT).show()
            Log.e("ERROR LOGIN", e.message)
        }
    }

我如何从Activity调用登录方法

fun submitLogin(view: View){
        val loginResult = authenticationViewModel.login()
        if(loginResult.isCancelled){
            Log.e("LOGIN FAILED", "Login cancelled")
        }else{
            Log.v("LOGIN SUCCESS", "Login success")
        }
    }

当我从CoroutineScope调用cancel方法并在if语句中触发一些代码时,我希望 isCancelled 属性更改为true

2 个答案:

答案 0 :(得分:1)

launch确实启动了异步协程。因此,login主体将在以后运行,并且您不能在调用后直接访问结果。 在您的示例中,一个简单的suspend函数可能会更好。

答案 1 :(得分:0)

您正在catch块上取消它。意思就是  repository.login(emailLogin.get()!!, passwordLogin.get()!!)不会引发任何异常。或者,如果不是,则抛出的不是AuthenticationHttpErrorException。只是要检查发生的错误,请尝试捕获一般的Exception,然后将协程以同样的方式处理。因此:

catch (e: Exception)