【问题标题】:RxJava2 map/flatMap with flatMapIterableRxJava2 地图/平面地图与 flatMapIterable
【发布时间】:2017-09-14 17:38:01
【问题描述】:

这是我想要实现的目标: 我有一个 API 响应说 myResponse,其中包含项目的 List。我想通过flatMapIterable 遍历每个项目,这很好。但在此之前,我想检查 API 是否没有返回错误或 List 大小是否 > 0。我无法做到这一点。 这是我到目前为止尝试过的代码:

    // 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");
                    }
                });

但我不确定我应该如何在flatMapIterable 之前使用mapflatmap 来检查任何错误。我正在做类似以下的事情但没有成功:

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 实现我想要的?

【问题讨论】:

    标签: android rx-java2


    【解决方案1】:

    map(response -&gt; {...}) 中,您创建了ObservableMyResponse,这就是它无法编译的原因。只需将map(response -&gt; {...}) 替换为flatMap(response -&gt; {...}) 或在flatMapIterable 之前添加flatMap(r -&gt; r)

    【讨论】:

    • 用 flatMap 替换地图有效 :) 谢谢。但是你能告诉我为什么它适用于 flatMap 而不是 map 吗?
    • 当然,您的错误处理代码将MyResponse 包装成Observable,因此处理的项目类型现在是Observable&lt;MyResponse&gt;。这就是为什么代码没有编译为getData()MyReponse 中的方法而不是Observable 中的方法。 flatMap“移除”外部Observable,所以类型现在和之前一样添加错误处理代码。
    猜你喜欢
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多