首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法使用RxJava的retryWhen运算符更新全局令牌

无法使用RxJava的retryWhen运算符更新全局令牌
EN

Stack Overflow用户
提问于 2018-08-09 17:04:05
回答 1查看 39关注 0票数 0

我的令牌将过期,因此我希望在令牌过期时使用retryWhen操作符自动获取令牌,在一个简单的类中刷新令牌,然后重试请求。但此时出现了一个问题,我得到了令牌,但是当我重新发起请求时,请求中的令牌是空的,但我确认我得到了令牌。

NetService

代码语言:javascript
复制
@GET("/meeting/api/v2.0/schedules")
fun getMySchedule(@Query("start_time") startTime: Long,
                  @Query("end_time") endTime: Long,
                  @Query("type") type: Int,
                  @Header("cookie") cookie: String = "ssoid=${MeetingTokenManager.accessToken}")
        : Observable<BaseData<List<MyScheduleResponse>>>

令牌单例

代码语言:javascript
复制
object MeetingTokenManager {
    var accessToken: String = ""
}

TokenRefreshFun

代码语言:javascript
复制
class TokenRefreshFun(private val baseView: IBaseView) : Function<Observable<Throwable>, ObservableSource<*>> {
var count = 0
override fun apply(t: Observable<Throwable>): ObservableSource<*> = t.flatMap {
    if (it is NetExceptionHandler.ResponseException) {
        if (it.code == 401) {
            logi("token验证失败.开始刷新token")
            if (count == 0) {
                count++
                baseView.tokenExpired()
            } else {
                Observable.error(it)
            }
        } else {
            Observable.error(it)
        }
    } else {
        Observable.error(it)
    }
}}

请求函数

代码语言:javascript
复制
 fun getMySchedule(startTime: Long,
                  endTime: Long,
                  type: Int = 1) {
    mScheduleBiz.getMySchedule(startTime, endTime, type)
            .compose(RxHelper.singleModeThread(iBaseView = mMyScheduleView))
            .retryWhen(TokenRefreshFun(mMyScheduleView))
            .subscribe(KNetObserver({
                mDisposables.add(it)
            }, {
                when (it.status) {
                    1 -> mMyScheduleView.getMyScheduleSuccess(it.data)
                    0 -> mMyScheduleView.getMyScheduleFailed("获取日程失败")
                }
            }, {
                mMyScheduleView.getMyScheduleFailed(it.message)
            }))
}

baseView.tokenExpired()

代码语言:javascript
复制
fun authorization(context: Context): Observable<String> {
    return Observable.create<String> { e ->
        AuthorizationManager.authorization(context, CLIENT_ID, { token ->
            accessToken = token
            logi(accessToken)
            JTUInfoSDK.getInstance().setCookie(token)
            LoginMyInfo.accessToken = token
            e.onNext(token)
        }, {
            e.onError(Throwable(it))
        })
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-08-10 04:04:01

你说你收到了令牌。我假设您的意思是,您的日志记录语句显示您收到了令牌。

但是,我注意到accessToken被分配了令牌的值,因此我假定您的网络访问代码使用了它。这个值是什么时候绑定的?我将猜测getMySchedule()绑定了标记的先前值,并且永远不会重新计算它。

您必须重新构造代码,以便在出现错误时重新绑定Cookie值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51762924

复制
相关文章

相似问题

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