2016-12-05 25 views
1

我是RxJava的新手,但我喜歡。現在我沒有什麼問題。 我使用RxJava + Retrofit如何將刷新令牌邏輯添加到RxJava + Retrofit?

如果我有用戶的有效令牌,我會得到API響應,但如果令牌無效,我必須刷新令牌並再次嘗試發出請求。

有效令牌:

  1. 讓reuqest
  2. 獲取響應
  3. 完成

無效令牌:

  1. 製作要求
  2. 獲取響應
  3. Ifresponse_code == 403,需要刷新令牌
  4. 刷新令牌
  5. 在這裏我要到1步,並要求API再次
  6. Else - 做

如何使用RxJava?

回答

2

試試這個人有我所知

service.normalRequest() 
      .flatMap(new Func1<Response, Observable<Response>>() { 
       @Override 
       public Observable<Response> call(Response response) { 
        if (response.code() == 403) { 
         return service.refreshToken(refreshRequest) 
           .flatMap(new Func1<Response, Observable<Response>>() { 
            @Override 
            public Observable<Response> call(Response response) { 
             return service.normalRequest(); 
            } 
           }); 

        } else { 
         return Observable.just(response); 
        } 

       } 
      }).subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(
       new Subscriber<Response>() { 
        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable e) { 

        } 

        @Override 
        public void onNext(Response response) { 

       } 
      }); 
1

沒有可以在這種情況下使用一個特殊的運算符:

public final Observable<T> retryWhen(final Func1<? super Observable<? extends Throwable>, ? extends Observable<?>> notificationHandler)

如果要實現它,你會看到什麼參數它接受:

observable.retryWhen(new Func1<Observable<? extends Throwable>, Observable<T>>() { 
    @Override 
    public Observable<T> call(final Observable<? extends Throwable> error) { 

    } 
}); 

可以看到,你會得到OkHttp拋出的錯誤。如果您撥打:

httpException.code() 

您將獲得HTTP代碼編號。

所以函數的實現上述可能看起來像:

observable.retryWhen(new Func1<Observable<? extends Throwable>, Observable<T>>() { 
     @Override 
     public Observable<T> call(final Observable<? extends Throwable> error) { 
      return error.flatMap(doRelogging()); 
     } 
    }); 

我做了一個小型的圖書館,已經做了你所期望的:

RetrofitRxErrorHandler

你可以嘗試,或只是查看有關獲取API錯誤的更高級重試策略的源代碼。