首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >修改- OkHttp身份验证器-如何使其他api调用暂停直到验证器完成执行

修改- OkHttp身份验证器-如何使其他api调用暂停直到验证器完成执行
EN

Stack Overflow用户
提问于 2022-09-26 09:59:13
回答 1查看 115关注 0票数 0

在一个带有viewmodel作用域的屏幕上,我有多个api调用,如viewmodel中的

代码语言:javascript
运行
复制
viewModelScope.launch {
    apiCallOne()
}

viewModelScope.launch {
    apiCallTwo()
}

viewModelScope.launch {
    apiCallThree()
}

我的预言家是

代码语言:javascript
运行
复制
override fun authenticate(route: Route?, response: Response): Request? {

    return if (response.retryCount < 1) {
        val token = refreshToken()
        if (token != null)
            response.request.newBuilder().header("Authorization", "Bearer $token")
                .build()
        else
            null
    } else {
        navigateToOnboardingActivity()
        null
    }


}

它运行良好,但当3个api调用被并行启动时,会话被刷新了3次,如何使它像apicallOne()获得401时那样工作,那么它将需要自动诱饵并调用刷新令牌api,此时apicallTwo()和apicallThree()应该在第一个身份验证器获得成功响应后暂停并恢复。

请注意,我不能像这样一次性调用所有apis

代码语言:javascript
运行
复制
viewModelScope.launch{
apiCallOne()
apiCallTwo()
apiCallThree()
}
EN

Stack Overflow用户

回答已采纳

发布于 2022-09-26 11:34:28

您可以使用如下示例:

代码语言:javascript
运行
复制
viewModelScope.launch{
 val result1 = async{apiCallOne()}.await()
 
 if (result1.code() != 401) {
    apiCallTwo()
    apiCallThree()
 }
}

或者这个:

代码语言:javascript
运行
复制
viewModelScope.launch{
     val result1 = withContext(Dispatchers.Default) {apiCallOne()}
     
     if (result1.code() != 401) {
        apiCallTwo()
        apiCallThree()
     }
    }
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73852481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档