使用RxJava重复改装调用,直到条件有效

时间:2016-03-10 04:59:58

标签: rx-java retrofit2 reactivex

问题:点击一个端点,直到返回的项目列表为空。每个连续的呼叫都会有一个更新的packetId查询参数,这是最后一项的packetId。

设置:使用Rx适配器进行Retrofit2

尝试

MyApiService api = retrofit.create(MyApiService.class);
Observable<Output> call = api.myCall(packetId);
call.repeat().takeUntil(output -> output != null && !output.isEmpty())
    .compose(applySchedulers())
    .subscribe(output -> {
        packetId = output.lastPacketId();
        onFetchOutput(output)
    });

这里的packetId不会得到更新,因为observable将使用与之创建的相同的params命中。

一旦获取结果,我总是可以再次调用此方法。

问题:是否有反应方式这样做?我假设它会涉及一些以某种方式反馈结果的操作员。

1 个答案:

答案 0 :(得分:0)

您可以使用PublishSubject

private static void test() {
    PublishSubject<Integer> packetSubject = PublishSubject.create();
    packetSubject
            .flatMap(integer -> call()
                    .doOnNext(output -> {
                        if (output == null) {
                            packetSubject.onCompleted();
                        }
                    }))
            .subscribe(output -> {
                if (output != null) {
                    packetSubject.onNext(output.lastPacketId);
                }});
    packetSubject.onNext(1);
}