如何重播RxJava 2中的订阅者?

时间:2017-09-08 17:19:31

标签: rx-java retrofit2 rx-java2

我正在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();
        }
    }
}

有没有办法重播订阅?

1 个答案:

答案 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令牌时,该观察者会发出。