使用RxJava for Android重试可观察直到满足某些条件

时间:2016-12-28 04:49:42

标签: android retrofit rx-java rx-android

我已经像这样使用Rxjava设置了Retrofit

    Retrofit retrofit = ApiManager.getAdapter();
        final SplashApiInterface splashApiInterface = retrofit.create(SplashApiInterface.class);
        final Observable<List<Data>> observable = splashApiInterface.getTenData(offset);
        observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).unsubscribeOn(Schedulers.io())

                .subscribe(new Subscriber<List<Data>>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();

                    }

                    @Override
                    public void onNext(List<Data> dataList) {

                          splashListener.takeDataToPres(dataList);
                        }
                    }
                });

我的要求是这样的,api一次生成10个数据的列表,我需要查询所有这些数据,将偏移值增加10,然后将这些数据附加到列表中。如何使用RxJava for android实现这一目标?

1 个答案:

答案 0 :(得分:1)

你可以这样做:

Observalbe.range(0, 100) // specify offset range
    .filter(i -> i%10==0) // takes only a multiples of ten
    .concatMap(i -> splashApiInterface.getTenData(i)) // makes subsequent API calls for each offset value
    .flatMap(data -> Observable.from(data)) // flattens each list
    .toList() // and collects all items to a single list
    ... // apply schedulers, subscribe and process your result list

您可以同时触发所有API调用。要实现这一目标 - 只需将concatMap替换为flatMap

没有lamdas的代码(RxJava 1.2.4):

Observable.range(0, 100)
            .filter(new Func1<Integer, Boolean>() {
                @Override
                public Boolean call(Integer i) {
                    return i % 10 == 0;
                }
            })
            .concatMap(new Func1<Integer, Observable<? extends List<Data>>>() {
                @Override
                public Observable<? extends List<Data>> call(Integer i) {
                    return splashApiInterface.getTenData(i);
                }
            })
            .flatMap(new Func1<List<Data>, Observable<? extends Data>>() {
                @Override
                public Observable<? extends Data> call(List<Data> data) {
                    return Observable.from(data);
                }
            })
            .toList()