2016-03-21 54 views
1

我決定在我的項目中使用Retrofit 2.0 + RxJava。 主要問題是我不完全理解它應該如何。使用Retrofit + RxJava在請求之間進行數據傳輸

首先,所有請求都發送到我的服務器API,並且每個請求都必須具有accessToken。

比如我想用我的API讓所有的書:

1.Send要求得到的accessToken要求

用的accessToken值2.註冊回覆

3.插入此值getBookRequest

4.發送getBookRequest,然後得到與JSONArray圖書的回覆

問題是我該如何做到這一點?

現在我有隻得到accessTokenValue方法:

public void accessToken() { 
    ApiMethods methods = ApiFactory.connect(); 
    methods.getAccess(MAIN_URL + ACCESS_URL) 
      .timeout(15, TimeUnit.SECONDS) 
      .retry(3) 
      .subscribeOn(Schedulers.newThread()) 
      .map(new Func1<List<GetAccess>, AccessToken>() { 
       @NonNull 
       @Override 
       public AccessToken call(List<GetAccess> getAccesses) { 
        double xA = (double) getAccesses.get(0).A; 
        double xB = (double) getAccesses.get(0).B; 
        double xC = (double) getAccesses.get(0).C; 
        passDouble = //...SOME MANIPULATING WITH VALUES...// 
        id = getAccesses.get(0).ID; 
        AccessToken token = new AccessToken(); 
        token.setId(String.valueOf(id)); 
        token.setToken(String.valueOf(passDouble)); 
        token.setIsCompleted(true); 


        return token; 
       } 
      }) 
      .onErrorReturn(new Func1<Throwable, AccessToken>() { 
       @Override 
       public AccessToken call(Throwable throwable) { 
        return new AccessToken(String.valueOf(id), String.valueOf(passDouble), false); 
       } 
      }) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Action1<AccessToken>() { 
       @Override 
       public void call(AccessToken accessToken) { 
        //EventBus.getDefault().post(accessToken); 
       } 
      }); 
} 

我應該用Observable.zip還是其他什麼東西?用第一個請求的值實現對我的服務器的第二個請求的更好方法是什麼?

回答

3

解決您的問題的方法是鏈接2個不同的可觀察對象:獲取訪問令牌 - >然後獲取書籍列表。

我建議讓您的accessToken這個樣子的:

public Observable<AccessToken> accesstoken() { 
    ApiMethods methods = ApiFactory.connect(); 
    return methods.getAccess(MAIN_URL + ACCESS_URL) 
      .timeout(15, TimeUnit.SECONDS) 
      .retry(3) 
      .subscribeOn(Schedulers.newThread()) 
      .map(new Func1<List<GetAccess>, AccessToken>() { 
       @NonNull 
       @Override 
       public AccessToken call(List<GetAccess> getAccesses) { 
        double xA = (double) getAccesses.get(0).A; 
        double xB = (double) getAccesses.get(0).B; 
        double xC = (double) getAccesses.get(0).C; 
        passDouble = //...SOME MANIPULATING WITH VALUES...// 
          id = getAccesses.get(0).ID; 
        AccessToken token = new AccessToken(); 
        token.setId(String.valueOf(id)); 
        token.setToken(String.valueOf(passDouble)); 
        token.setIsCompleted(true); 


        return token; 
       } 
      }) 
      .onErrorReturn(new Func1<Throwable, AccessToken>() { 
       @Override 
       public AccessToken call(Throwable throwable) { 
        return new AccessToken(String.valueOf(id), String.valueOf(passDouble), false); 
       } 
      }); 
} 

然後你可以使用它像這樣:

accessToken() 
     .flatMap(new Func1<AccessToken, Observable<List<Book>>>() { 
      @Override 
      public Observable<?> call(AccessToken accessToken) { 
       ApiMethods methods = ApiFactory.connect(); 
       return methods.getBookRequest(accessToken); 
      } 
     }) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Action1<List<Book>>() { 
      @Override 
      public void call(List<Book> books) { 
       // handle your list of books 
      } 
     }); 

這裏的關鍵是flatMap運算符鏈這兩個觀測。

+0

非常感謝,這正是我所需要的,代碼很棒! – Ololoking