2016-01-13 31 views
1

我使用RxJava進行了Retrofit請求API調用。一切運作良好。如何在RxJava中使用Retrofit管理結果

如何優化此代碼。我是RxJava的新人。 我將不勝感激一個小例子的代碼或鏈接。 謝謝。

Observable<Review> observer = Observable.just(review); 
    observer.subscribeOn(Schedulers.newThread()) 
      .observeOn(Schedulers.newThread()) 
      .map(new Func1<Review, Uri>() { 

       @Override 
       public Uri call(Review review) { 
        Uri uri = null; 
        /// Some code 
        return uri; 
       } 
      }).subscribe(new Action1<Uri>() { 
     @Override 
     public void call(Uri uri) { 
      if(uri != null) { 
       Api.Reviews reviewApi = retrofit.create(Api.Reviews.class); 
       Observable<BaseResponse<Review>> reviews = reviewApi.createReview(authToken, review); 
       reviews.subscribeOn(Schedulers.newThread()) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .map(new Func1<BaseResponse<Review>, Void>(){ 
          @Override 
          public Void call(BaseResponse<Review> response) { 
           //Code Here 
           return null; 
          } 
         }).subscribe(); 
      } 
     } 
    }); 

回答

3

有幾個選項:地圖,doOnNext,flatMap,等等,這取決於你想要事後與改造結果做什麼。例如:

reviews 
.subscribeOn(Schedulers.io()) 
.observeOn(Schedulers.io()) 
.map(r -> { 
    try { 
     someDB.save(r); 
    } catch (Exception ex) { 
     throw new RuntimeException(ex); 
    } 
    return r; 
}) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(v -> { }, e -> { log(e); }); 

reviews 
.subscribeOn(Schedulers.io()) 
.observeOn(Schedulers.io()) 
.doOnNext(r -> { 
    try { 
     someDB.save(r); 
    } catch (Exception ex) { 
     throw new RuntimeException(ex); 
    } 
}) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(v -> { }, e -> { log(e); }); 

reviews 
.subscribeOn(Schedulers.io()) 
.observeOn(Schedulers.io()) 
.flatMap(r -> { 
    try { 
     someDB.save(r); 
     return Observable.empty(); // or Observable.just(r); 
    } catch (Exception ex) { 
     return Observable.error(ex); 
    } 
}) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(v -> { }, e -> { log(e); }); 
+0

注意:要得到好的lambda符號,[retrolambda](https://github.com/evant/gradle-retrolambda) – njzk2

+0

第一個地圖示例有點尷尬。如果'save(r)'返回一個可觀察值,那麼第三個使用flatmap會更有意義,這樣就可以很好地鏈接。 – njzk2