从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
答案 0 :(得分:1)
launch
确实启动了异步协程。因此,login
主体将在以后运行,并且您不能在调用后直接访问结果。
在您的示例中,一个简单的suspend
函数可能会更好。
答案 1 :(得分:0)
您正在catch
块上取消它。意思就是
repository.login(emailLogin.get()!!, passwordLogin.get()!!)
不会引发任何异常。或者,如果不是,则抛出的不是AuthenticationHttpErrorException
。只是要检查发生的错误,请尝试捕获一般的Exception
,然后将协程以同样的方式处理。因此:
catch (e: Exception)