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 回答