android - 我如何在 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
解决方案
launch
确实启动了一个异步协程。因此login
-body 将稍后运行,您无法在调用后直接访问结果。在您的示例中,一个简单的suspend
功能可能会更好。
推荐阅读
- python - 如何在Win10上正确安装Python、VSCode、flake8
- java - Java JSONObject 不同键进入列表
- google-apps-script - 如何使用复选框隐藏 Google 表格中的列
- cognos - 无法安装 IBM cognos Analytics
- c - realloc() : char* 变量的下一个大小无效
- c++ - 如何删除 C++ 列表中迭代器指向的元素?
- python - Discord.py 卡片图片库?
- python - 如何使用 pyspark 在 Hadoop 中读取 parquet 文件、更改数据类型并写入另一个 Parquet 文件
- javascript - 手机摄像头通过p5js访问
- mysql - 如何将查询结果导出到 Windows 机器 MySQL 8.0 中的 csv?