【发布时间】:2020-03-22 15:41:40
【问题描述】:
在我的视图模型中,我有一个使用协程调用 API 的函数。
fun loadPosts(){
GlobalScope.launch(coroutineContext){
changeState(load = true)
val list= withContext(Dispatchers.IO) {
apiService.getProfile(AUTH)
}
changeState(false,false,null)
showResult(list)
}
}
每次我点击一个按钮,这个函数都会被触发,API 被调用并且我得到有效的响应。但是一旦我的 api 得到 500 或 Http 401 Unauthorized 之类的异常,然后当我再次点击按钮时,协程永远不会被调用,并且似乎它从缓存中返回了再次错误消息。
对于一个用例:
我点击按钮 -> Api 被调用 -> 得到成功响应
我再次点击 -> Api 被调用 -> 得到成功响应
我从手机上断开了互联网
我点击了按钮 -> 调用了 Api -> 出现了类似 ConnectionError 的异常
我将手机连接到互联网
我点击了按钮 -> Api 未被调用 -> 出现了类似 ConnectionError 的异常
现在即使我的手机有有效的互联网连接,我按下按钮,而不是调用 api 并等待响应,它一次又一次地给我之前失败的响应。
之前我使用的是 Rxjava,但我没有遇到任何此类问题。我是协程的新手,所以如果有人有任何建议,欢迎您
【问题讨论】:
-
您在
CoroutineScope()通话中放置的coroutineContext中有什么内容?我怀疑你在上下文中有一个常规的Job实例。 -
coroutineContext 在我的 BaseViewModel 中定义,例如抽象类 BaseViewModel : ViewModel(), CoroutineScope{ private val job: Job= Job() override val coroutineContext: CoroutineContext get() = Dispatchers.Main +工作 + 处理程序 _ _ _ _
-
你使用
SupervisorJob吗?你应该使用SupervisorJob来避免子协程的错误传播。否则,当孩子出现异常时,您的根作业将被取消。 -
主管职位?这个对我来说是新的吧。让我检查一下。
-
@Choim 非常感谢。似乎它现在工作正常。我刚刚将 Job() 替换为 SuperivsorJob() 并且它现在工作正常。不知道背后的魔法还开心。
标签: android kotlin retrofit rx-java kotlin-coroutines