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

3
我已经按照以下方式设置了Retrofit和Rxjava。
    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个数据的列表,我需要通过增加偏移值来查询所有这些数据,然后将这些数据附加到列表中。如何在Android上使用RxJava实现这一点?

1个回答

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
不带lambda表达式的代码(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()

你愿意在不使用retrolambda的情况下发布它吗? - theanilpaudel
我从Retrofit获取了一个Data列表的Observable,在这个Observable中,我无法使用range等其他方法,就像你所提到的那样。 - theanilpaudel
你不需要在你的可观察对象上使用rangeObservable.range只会发出偏移值。然后在下游,这个值被用来进行API调用。 - Maksim Ostrovidov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接