我正在rxJava2中寻找一种方法,我可以在执行操作后再次呼叫订阅者。让我具体描述我的意图。
我正在使用retrofit2进行联网,但这并不重要。这个问题是关于rxJava的。刷新令牌后,我想重试api调用。我需要设置的是每次进行任何api调用时,令牌都会过期,我有责任调用另一个api调用来刷新令牌。令牌之后 刷新我需要再次调用具有过期令牌的相同api调用。因此,对用户来说,它可以无缝刷新令牌。
这是我用于所有网络电话的默认订阅:
public class DefaultSubscriber<T> implements Observer<T> {
Disposable disposable;
@Override
public void onSubscribe(@NonNull Disposable d) {
Timber.d("subscribing called now ...");
disposable = d;
}
@Override
public void onNext(@NonNull T t) {
Timber.d("onNext called now ..."+t);
}
@Override
public void onError(@NonNull Throwable e) {
Timber.e(e);
Timber.d("onError called now ...");
if (e instanceof HttpException) {
//todo analytics can go here
// We had non-2XX http error
HttpException exception = (HttpException) e;
if (exception.code() == 401){
//token expired here, handle it
//so i'll call another api here (to refresh token)but then i need to replay this subscriber , how ?
}
}
if (e instanceof IOException) {
// A network or conversion error happened
}
}
@Override
public void onComplete() {
Timber.d("onComplete called now ...");
}
public void unsubscribe() {
Timber.d("Un-subscribed called now ..");
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
}
}
有没有办法重播订阅?
答案 0 :(得分:1)
您可以使用retryWhen()
运算符重新订阅。
networkApiObservable
.retryWhen( errorObservable ->
errorObservable.flatMap( error ->
{
if ( error.equals(EXPIRED_API_TOKEN) ) {
return getNetworkApiTokenObservable();
}
return Observable.error( error );
}
.subscribe();
我将假设getNetworkApiTokenObservable()
返回一个观察者,当networkApiObservable
来源有新的API令牌时,该观察者会发出。