我有一个需要会话(cookie)来处理网络调用的应用程序。我在用着Retrofit+RxJava
。但是,会话可能会过期(带有 401 未经授权状态的改造错误),在这种情况下我想重新进行身份验证(以获取新的 cookie)并重试之前的调用。我该怎么做RxJava
?
我的例子:
getServerApi().getDialogs(offset, getCookies())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(observable -> {...}) // Need some logic
.subscribe(dialogsEnvelope -> getView().setDialogs(dialogsEnvelope),
throwable -> getView().setError(processFail(throwable)));
虽然Interceptor
可能是这个特定问题的更好解决方案,该问题专门要求使用解决方案retryWhen
,所以这是一种方法:
retryWhen(new Func1<Observable<Throwable>, Observable<?>>(){
@Override
public void Observable<?> call(Observable<Throwable>> attempts) {
return attempts.flatMap(new Func1<Throwable, Observable<?>>() {
@Override
public Observable<?> call(Throwable throwable) {
if (throwable instanceof RetrofitError) {
RetrofitError retrofitError = (RetrofitError) throwable;
if (retrofitError.getKind() == RetrofitError.Kind.HTTP && retrofitError.getResponse().getStatus() == 401) {
// this is the error we care about - to trigger a retry we need to emit anything other than onError or onCompleted
return Observable.just(new Object());
} else {
// some other kind of error: just pass it along and don't retry
return Observable.error(throwable);
}
} else {
// some other kind of error: just pass it along and don't retry
return Observable.error(throwable);
}
}
});
}
})
然而,你的getCookies
在简单的情况下不会再次调用retry
。那只会重新订阅相同的内容Observable
but getCookies
在创建之前被调用Observable
。所以我认为你必须包装源代码的创建Observable
in a defer
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)