我有一个使用 OAuth2 进行身份验证并使用 Retrofit 从 RESTful 服务中获取数据的应用程序。现在,我已经启动并运行了令牌检索和刷新。令牌像这样刷新(调度程序省略):
// Each Retrofit call observable is "wrapper" using this method
protected <T> Observable<T> wrap(@NonNull final Observable<T> page) {
return authenticate()
.concatMap(token -> page)
.onErrorResumeNext(throwable -> {
Log.w(TAG, "wrap: ErrorResumeNext", throwable);
return refreshAccessToken()
.flatMap(accessToken -> page);
}));
}
// Retrieves the access token if necessary
Observable<AccessToken> authenticate() {
// Already have token
if(accessToken != null) return Observable.just(accessToken);
// No token yet, fetch it
return api.getAccessToken(...);
}
// Refreshes the token
Observable<AccessToken> refreshAccessToken() {
return api.refreshToken(...);
}
这可行,但在某些情况下,一次发送多个请求并且它们都调用刷新过程 - 基本上我的应用程序最终刷新令牌的次数与当前请求的次数一样多。
所以,问题是:我如何确保当令牌需要刷新时,它只执行一次,不管有多少正在进行的请求需要刷新令牌?我能否以某种方式让其他请求“等待”直到第一个请求成功调用并检索到新令牌?