首页 > 解决方案 > 我如何在 CoroutineScope 内取消并检测取消

问题描述

从 CoroutineScope 检测取消

我正在尝试从 CoroutineScope 检测取消,但是当我尝试在 CoroutineScope 中调用取消方法时,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 调用取消方法并在 if 语句中触发一些代码时,我期待isCancelled属性更改为 true

标签: androidkotlinkotlin-coroutines

解决方案


launch确实启动了一个异步协程。因此login-body 将稍后运行,您无法在调用后直接访问结果。在您的示例中,一个简单的suspend功能可能会更好。


推荐阅读