2017-09-14 123 views
0

下面是我想要实现的: 我有一个API响应说myResponse,其中包含List项目。我想遍历每个项目通过flatMapIterable哪些工作正常。但在此之前,我想检查API是否未返回错误或List大小> 0.我无法实现此目的。 这是我迄今为止尝试过的代码:RxJava2 map/flatMap with flatMapIterable

// This works & I am able to iterate through each item 
myApi.getData() 
.subscribeOn(Schedulers.newThread()) 
.observeOn(AndroidSchedulers.mainThread()) 
.flatMapIterable(response -> response.getData().getItems()) 
.subscribeWith(new DisposableObserver<Mobile>() { 
        @Override 
        public void onNext(@NonNull Item item) { 
         Log.e("TAG", "item is => " + item.getItemName()); 
        } 

        @Override 
        public void onError(@NonNull Throwable e) { 

        } 

        @Override 
        public void onComplete() { 
         Log.e("TAG", "processing completed"); 
        } 
       }); 

但我不知道我应该如何使用mapflatmapflatMapIterable之前检查任何错误。我做类似下面没有任何成功:

myApi.getData() 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .map(response -> { 
     if(response.getStatus() == 200) { 
      List<Item> items = response.getData().getItems(); 
      if(items == null || items.size() < 1) 
        return Observable.error(new Throwable("No data!")); 

      return Observable.just(response); 
     } 

     return Observable.error(new Throwable(response.getData().getMsg())); 
    }) 
    .doOnError(Throwable::getMessage) 
    .flatMapIterable(response -> response.getData().getItems()); 

这里就flatMapIterable,我得到错误无法解析的getData()。因为我相信它无法将response识别为MyResponse.class。我被困在这里,请让我知道我该如何用RxJava2实现我想要的?

回答

2

map(response -> {...})您已经创建ObservableMyResponse,这就是为什么它不编译。只需将map(response -> {...})替换为flatMap(response -> {...})或在flatMapIterable之前添加flatMap(r -> r)即可。

+0

更换地图与flatMap工作:)谢谢。但是,你能告诉我为什么它与flatMap和不与地图一起工作? –

+1

当然,你的错误处理代码将'MyResponse'包装成'Observable',所以处理的项目类型现在是'Observable '。这就是为什么代码没有编译为'getData()'是'MyReponse'中的方法而不是'Observable'。 'flatMap'“移除”外部'Observable',所以类型现在和添加错误处理代码一样。 – hgrey

+0

谢谢你的伴侣:) –