我是RxJava的新手,但我喜歡。現在我沒有什麼問題。 我使用RxJava
+ Retrofit
。如何將刷新令牌邏輯添加到RxJava + Retrofit?
如果我有用戶的有效令牌,我會得到API響應,但如果令牌無效,我必須刷新令牌並再次嘗試發出請求。
有效令牌:
- 讓reuqest
- 獲取響應
- 完成
無效令牌:
- 製作要求
- 獲取響應
If
response_code == 403
,需要刷新令牌- 刷新令牌
- 在這裏我要到1步,並要求API再次
Else
- 做
如何使用RxJava?
我是RxJava的新手,但我喜歡。現在我沒有什麼問題。 我使用RxJava
+ Retrofit
。如何將刷新令牌邏輯添加到RxJava + Retrofit?
如果我有用戶的有效令牌,我會得到API響應,但如果令牌無效,我必須刷新令牌並再次嘗試發出請求。
有效令牌:
無效令牌:
If
response_code == 403
,需要刷新令牌Else
- 做如何使用RxJava?
試試這個人有我所知
service.normalRequest()
.flatMap(new Func1<Response, Observable<Response>>() {
@Override
public Observable<Response> call(Response response) {
if (response.code() == 403) {
return service.refreshToken(refreshRequest)
.flatMap(new Func1<Response, Observable<Response>>() {
@Override
public Observable<Response> call(Response response) {
return service.normalRequest();
}
});
} else {
return Observable.just(response);
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
new Subscriber<Response>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Response response) {
}
});
沒有可以在這種情況下使用一個特殊的運算符:
如果要實現它,你會看到什麼參數它接受:
observable.retryWhen(new Func1<Observable<? extends Throwable>, Observable<T>>() {
@Override
public Observable<T> call(final Observable<? extends Throwable> error) {
}
});
可以看到,你會得到OkHttp拋出的錯誤。如果您撥打:
httpException.code()
您將獲得HTTP代碼編號。
所以函數的實現上述可能看起來像:
observable.retryWhen(new Func1<Observable<? extends Throwable>, Observable<T>>() {
@Override
public Observable<T> call(final Observable<? extends Throwable> error) {
return error.flatMap(doRelogging());
}
});
我做了一個小型的圖書館,已經做了你所期望的:
你可以嘗試,或只是查看有關獲取API錯誤的更高級重試策略的源代碼。