2017-09-14 119 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

謝謝你的伴侶:) –