2017-09-08 3 views
1

私はrxJava2の中で、いったんアクションが実行されると再び加入者に電話をかけることができる方法を探しています。私の意図を具体的に説明しましょう。RxJava 2でサブスクライバを再生する方法は?

私はネットワークに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

retryWhen()演算子を使用して再登録することができます。

networkApiObservable 
    .retryWhen(errorObservable -> 
    errorObservable.flatMap(error -> 
    { 
     if (error.equals(EXPIRED_API_TOKEN)) { 
     return getNetworkApiTokenObservable(); 
     } 
     return Observable.error(error); 
    } 
    .subscribe(); 

私はgetNetworkApiTokenObservable()は、新しいAPIトークンがnetworkApiObservableソースに利用可能になったとき発することに観察を返すことを前提としています。

関連する問題