java - 如何使用响应式 android 和 Retrofit 发出多个请求

标签 java android retrofit rx-java rx-android

我有一个调用 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);

在数据层中,我有 Interactor,它通过 Retrofit 向服务器发出请求并返回 List<Shop> .

@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<List<Shop>>给演示者。

我是响应式(Reactive)编程的新手,也许有一些运算符允许执行此操作。

如有任何帮助,我们将不胜感激。

最佳答案

只需使用 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();

关于java - 如何使用响应式 android 和 Retrofit 发出多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40807728/

相关文章:

java - 给定一堆整数,请仅使用加号运算输出所有可能数字的所有组合

android - 水平放置 float 操作按钮

java - 无法将照片上传到服务器android retrofit 2

java - 如何从所有者实例访问变量?

java - android.view.InflateException : Binary XML file line #51: Error inflating class com. android.internal.widget.DialogTitle

java - 带有自定义列表适配器的 fragment 导致膨胀 View 崩溃

java - 由于 ProgressDialog,尝试规避 AsyncTask 上的 NetworkOnMainThreadException

java - 在 Web 应用程序中使用 QR 进行移动身份验证

java - 改造:发送 POST 请求

android - 使用 Retrofit 发布时 Realm 对象为空