0

自動生成された AWS Android SDK を使用して REST API にアクセスしています。例

Repos =  restClient.getRepos();

この呼び出しは非同期タスクである必要がありますが、私はそれを Observable で変換しています

final Observable reposRx = Observable.fromCallable(() -> restClient.getRepos());

REST API を使用する http クライアントは、認証にトークンを使用します。REST API からメソッドを実行し、トークンの有効期限が切れている場合、エラーがスローされるため、REST 呼び出しを実行する前に、トークンの有効期限が切れているかどうかを確認する必要があります(これは、変数をチェックする同期メソッドをチェックインするだけで行われます)。有効期限が切れている場合は、別の非同期ネットワーク呼び出しを実行して更新する必要があります。

if(isTokenExpired()) { 
   refreshToken((new RefreshIdTokenCallback() {
       @Override 
       public void onSuccess(final String idToken) 
       {
         getRepos()
       }
       @Override
       public void onFailure(final Throwable error) 
       {
         //How to connect it with Rx
       }
      });
   }
   else
   {
     getRepos()
   }

したがって、トークンが更新された後、元の REST API 呼び出しを実行できるようになりました。

public void getRepos()
  {
   reposRx
   .subscribeOn(Schedulers.newThread())
   .observeOn(AndroidSchedulers.mainThread())    
   .subscribe(new Subscriber<Repos>() {
      @Override
      public void onCompleted() {
      }
      @Override
      public void onError(final Throwable e) {
      }
      @Override
      public void onNext(final Repos repos) {
            //update the list
      }
    });
}

すべてを RxJava に変換する魔法の方法はありますか?また、期限切れの更新が行われ、REST API を呼び出す場合に、トークンの有効期限をチェックするすべての REST API メソッドで再利用できるメソッドがありますか? また、 onFailed ? を接続します。(すべて Rx 付き)

4

1 に答える 1

0

API について何も知らないので、最初に試してみましょう。

Observable<String> refresh = Observable.defer(() ->    
  Observable<String>.create(subscriber -> {
    refreshToken(new RefreshIdTokenCallback() {
      @Override 
      public void onSuccess(final String idToken) 
      {
        subscriber.onNext(idToken);
        subscriber.onComplete();
      }
      @Override
      public void onFailure(final Throwable error) 
      {
        subscriber.onError(error);
      }
    })
  })
  .subscribeOn(Schedulers.newThread())
);

Observable<?> checkExpiration = 
    Observable
    .defer(() -> Observable.just(isTokenExpired()))
    .flatMap(expired -> expired ? refresh : just(""));

これで、好きなように接続できcheckExpirationます。それは単一のダミーアイテムを放出し、それを好きなように使用mapできます。flatMap

于 2016-08-29T19:43:25.280 に答える