gpt4 book ai didi

java - 从另一个可观察对象调用可观察对象

转载 作者:行者123 更新时间:2023-11-30 06:13:40 25 4
gpt4 key购买 nike

我是 RxJava 框架的新手。我的系统使用 token 身份验证,当我想从 http 请求获取任何响应时,由于过期时间,我需要刷新我的身份验证 token 。

但是在从一个可观察到另一个可观察调用 subscribe 方法后遇到了问题

主类(第一个可观察的)

service.getPosts(offset,limit, PreferencesUtils.getAccessTokenKey())
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(response -> {
if (!response.isSuccessful()) throw new RuntimeException();
})
.subscribe(
feeds -> mView.showNewsFeedItems(feeds.body()),
error -> {
Helper.refreshToken();
service.getPosts(offset,limit,PreferencesUtils.getAccessTokenKey());
}
);

我的响应不成功,我需要调用 refreshToken() 来刷新 token 并将其保存到 PreferencesUtils

辅助类(第二个可观察的)

service.refreshToken(PreferencesUtils.getAccessTokenKey(), PreferencesUtils.getRefreshTokenKey())
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(Schedulers.newThread())
.subscribe(


// doesnt proceed this part of code
response -> {
PreferencesUtils.saveAccessToken(response.body().getAccessToken());
PreferencesUtils.saveRefreshToken(response.body().getRefreshToken());
},

error -> Log.d(TAG, "refresh token exception: " + `error.getMessage())`
//

);

当我使用调试器时,Helper 类中的第二个可观察对象无法正常工作,它不想继续此服务,并且在订阅时立即完成,没有任何错误(当然它正在等待完成主线程的所有操作)。由于订阅方法没有继续(没有将访问 token 保存到首选项),我无法执行我的 service.getPosts() 函数。

请帮忙!我将不胜感激!

最佳答案

不要像那样拆分观察者链,而是使用 retryWhen() 运算符来响应失败的 token 。

Observable.just(Boolean.TRUE)
.flatMap( ignored -> service
.getPosts(offset,limit,
PreferencesUtils.getAccessTokenKey()) )
.subscribeOn(Schedulers.computation())
.doOnNext(response -> {
if (!response.isSuccessful()) throw new TokenException();
})
.retryWhen( error -> error.flatMap( f ->
{
if ( f instanceof TokenException ) {
return service.refreshToken(PreferencesUtils.getAccessTokenKey(), PreferencesUtils.getRefreshTokenKey())
.doOnNext( response -> {
PreferencesUtils.saveAccessToken(response.body().getAccessToken());
PreferencesUtils.saveRefreshToken(response.body().getRefreshToken());
});
}
return Observable.error(f);
})
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe( /* do stuff */ );

retryWhen() 运算符采用一个可观察对象,该可观察对象将获取上游抛出的任何异常。如果异常是 TokenException,它将尝试通过调用 refreshToken() 返回的可观察值来刷新 token ,然后将结果保存到您的首选项中。

编辑:使用可以毫无问题地重新订阅的可观察对象启动观察者链。当必须刷新访问 token 时,将使用新 token 调用 getPosts()

关于java - 从另一个可观察对象调用可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49701357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com