【问题标题】:Retry observable till some conditions are met using RxJava for Android使用 RxJava for Android 重试 observable 直到满足某些条件
【发布时间】:2016-12-28 13:47:38
【问题描述】:

我已经像这样使用 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个数据的列表,我需要查询所有这些数据,将偏移值增加10,然后将这些数据附加到列表中。如何使用 RxJava for android 实现这一点?

【问题讨论】:

    标签: android retrofit rx-java rx-android


    【解决方案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()
    

    【讨论】:

    • 你愿意在不使用retrolambda的情况下发布它吗?
    • 我从改造中得到了一个数据列表的 Observable,在这个 Observable 中我不能使用 range 方法和你提到的其他方法。
    • 你不需要在 你的 observable 上使用rangeObservable.range 只是发出偏移值。在流的下游,该值用于进行 API 调用。
    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2019-09-25
    相关资源
    最近更新 更多