【问题标题】:How to make multiple requests with reactive android and retrofit如何使用响应式 android 和改造发出多个请求
【发布时间】:2016-11-25 15:00:05
【问题描述】:

我有一个调用 getShops() 方法的演示者。

Observable<List<Shop>> observable = interactor.getData();
        Subscription subscription = observable
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<List<Shop>>() {
                    @Override
                    public void onCompleted() {
                        view.hideProgress();
                    }

                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                        view.hideProgress();
                    }

                    @Override
                    public void onNext(List<Shop> shops) {
                        handleShops(shops);
                        view.onSuccess();
                    }
                });
        composite.add(subscription);

在数据层我有交互器,它通过改造向服务器发出请求并返回List&lt;Shop&gt;

@Override
public Observable<List<Shop>> getData() {
    return api.getShops(pageNum).map(new Func1<ShopWrapper, List<Shop>>() {
        @Override
        public List<Shop> call(ShopWrapper wrapper) {
            return wrapper.getShops();
        }
    });
}

问题是我需要用不同的页面参数发出多个相同的请求,因为服务器每页返回N个商店,我需要收集所有商店然后将Observable&lt;List&lt;Shop&gt;&gt;返回给演示者。

我是响应式编程的新手,也许有一些操作员允许这样做。

任何帮助将不胜感激。

【问题讨论】:

    标签: java android retrofit rx-java rx-android


    【解决方案1】:

    只需使用Observable.rangeconcatMap 来调用它。 如果你不知道你的上限,你可以在某些条件下使用takeUntil

    类似这样的:

    Observable.range(0, Integer.MAX_VALUE)
                .concatMap(pageNum -> api.getShops(pageNum).map(doYourMapping))
                .takeUntil(shops -> someCondition);
    

    如果你只想要一个 onNext 调用,你可以在 takeUntil 之后添加这个:

    .flatMapIterable(shops -> shops)
    .toList();
    

    【讨论】:

      【解决方案2】:

      您可以使用Observable.concat 方法来实现。

      /**
       * Returns an Observable that emits the items emitted by two Observables, one after the other, without
       * interleaving them.
      */
      
      Observable<List<Shop>> observable = Observable.concat(
                  interactor.getData(0),  interactor.getData(1), interactor.getData(2) //and so on);
      

      您的getData 方法应该接受pageNum 参数:
      public Observable&lt;List&lt;Shop&gt;&gt; getData(int pageNum)

      但这只是您特定问题的答案,无法满足您的需求。因为正如我所见,可能有不同的页数,但 concat 仅用于可观察的静态计数。

      你可以尝试解决这个问题with building observable recursively

      【讨论】:

      • 正是我需要进行一种递归调用并将结果收集到一个可观察的列表中,感谢您提供的链接,我会检查一下。
      猜你喜欢
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      相关资源
      最近更新 更多