2016-01-13 43 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