android – Kotlin Coroutines – 嵌套协同程序是在一个协同程序中处理不同线程的正确方法吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了android – Kotlin Coroutines – 嵌套协同程序是在一个协同程序中处理不同线程的正确方法吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1562字,纯文字阅读大概需要3分钟。
内容图文
![android – Kotlin Coroutines – 嵌套协同程序是在一个协同程序中处理不同线程的正确方法吗?](/upload/InfoBanner/zyjiaocheng/811/47c37673218b4f1fbffbd272aac38928.jpg)
我正在尝试使用协程而不是RxJava在基本的网络调用上第一次看到它是什么样的,并遇到滞后/线程的一些问题
在下面的代码中,我正在进行网络调用userRepo.Login(),如果发生异常,我会显示错误消息并停止我在函数开始时启动的进度动画.
如果我将所有内容保留在CommonPool上(或者不添加任何池),它会崩溃,如果发生异常,则必须在looper线程上完成动画.在其他情况下,我收到错误,说这必须在UI线程上完成,同样的问题,不同的线程要求.
我无法在UI线程上启动整个协同程序,因为登录调用将阻止,因为它在UI线程上并且弄乱了我的动画(这是有意义的).
我能看到解决这个问题的唯一方法是从现有协程中的UI线程上启动一个新的协同程序,它可以工作,但看起来很奇怪.
这是做事的正确方法,还是我错过了什么?
override fun loginButtonPressed(email: String, password: String) {
view.showSignInProgressAnimation()
launch(CommonPool) {
try {
val user = userRepo.login(email, password)
if (user != null) {
view.launchMainActivity()
}
} catch (exception: AuthException) {
launch(UI) {
view.showErrorMessage(exception.message, exception.code)
view.stopSignInProgressAnimation()
}
}
}
}
解决方法:
您应该从另一端开始:启动基于UI的协同程序,从中将重型操作移交给外部池.选择的工具是withContext():
override fun loginButtonPressed(email: String, password: String) {
view.showSignInProgressAnimation()
// assuming `this` is a CoroutineScope with dispatcher = Main...
this.launch {
try {
val user = withContext(IO) {
userRepo.login(email, password)
}
if (user != null) {
view.launchMainActivity()
}
} catch (exception: AuthException) {
view.showErrorMessage(exception.message, exception.code)
view.stopSignInProgressAnimation()
}
}
}
这样你就可以保留自然的Android编程模型,它采用GUI线程.
内容总结
以上是互联网集市为您收集整理的android – Kotlin Coroutines – 嵌套协同程序是在一个协同程序中处理不同线程的正确方法吗?全部内容,希望文章能够帮你解决android – Kotlin Coroutines – 嵌套协同程序是在一个协同程序中处理不同线程的正确方法吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。