Я пытаюсь обрабатывать исключения в приложении на глобальном уровне, так что retrofit выдает ошибку, которую я улавлю в определенном классе с логикой для обработки этих ошибок.
У меня есть интерфейс
@POST("/token")
AuthToken refreshToken(@Field("grant_type") String grantType, @Field("refresh_token") String refreshToken);
и наблюдаемые
/**
* Refreshes auth token
*
* @param refreshToken
* @return
*/
public Observable<AuthToken> refreshToken(String refreshToken) {
return Observable.create((Subscriber<? super AuthToken> subscriber) -> {
try {
subscriber.onNext(apiManager.refreshToken(REFRESH_TOKEN, refreshToken));
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}).subscribeOn(Schedulers.io());
}
Когда я получаю 401 с сервера (неверный токен или какая-либо другая связанная с сетью ошибка), я хочу обновить токен и повторить остальные вызовы. Есть ли способ сделать это с помощью rxjava для всех вызовов отдыха с каким-то наблюдаемым, который поймает эту ошибку во всем мире, обработает ее и повторит вызов, который его выбрал?
На данный момент я использую тему, чтобы поймать ошибку на .subscribe(), подобную этой
private static BehaviorSubject errorEvent = BehaviorSubject.create();
public static BehaviorSubject<RetrofitError> getErrorEvent() {
return errorEvent;
}
и при некотором вызове
getCurrentUser = userApi.getCurrentUser().observeOn(AndroidSchedulers.mainThread())
.subscribe(
(user) -> {
this.user = user;
},
errorEvent::onNext
);
то в моем основном действии я подписываюсь на этот предмет поведения и разбираю ошибку
SomeApi.getErrorEvent().subscribe(
(e) -> {
//parse the error
}
);
но я не могу повторить вызов наблюдаемого, который выдает ошибку.