gpt4 book ai didi

android - 实现 retryWhen 逻辑

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:43 25 4
gpt4 key购买 nike

我有一个应用程序需要 session (cookie) 来处理网络调用。我正在使用 Retrofit+RxJava。但是, session 可能会过期(Retrofit 错误,状态为 401 Unauthorized),我想重新验证(以获取新的 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 不会被再次调用。这只会重新订阅相同的 ObservablegetCookies 在创建该 Observable 之前被调用。所以我认为您必须将源 Observable 的创建包装在 defer 中。

关于android - 实现 retryWhen 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30517761/

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