使用onComplete每隔x秒调用RxJava服务

时间:2017-03-03 08:51:48

标签: android rx-java retrofit2

我需要每隔X秒进行一次相同的网络呼叫,所以我使用了下面的代码

Observable.interval(X, TimeUnit.SECONDS)
                .flatMap(n -> myCall())
                .flatMap(response -> Observable.from(response.getList())
                .doOnNext(object -> createNewObject())
                .doOnCompleted(() -> myStuff())
                .subscribe()

但问题是我从未调用过doOnCompleted。 有没有办法每隔X秒继续调用我的服务,但每次调用后都有一个onComplete?

3 个答案:

答案 0 :(得分:3)

您可以将您的流媒体操作符移动到第一个flatMap中,您将收到onComplete调用。

Observable.interval(X, TimeUnit.SECONDS)
            .flatMap(n -> myCall().flatMap(response -> Observable.from(response.getList())
                .doOnNext(object -> createNewObject())
                .doOnCompleted(() -> myStuff())
            )

答案 1 :(得分:2)

Observable.interval(X, TimeUnit.SECONDS)
            .flatMap(n -> myCall())
            .doOnNext(() -> myStuff())
            .subscribe()

对于网络呼叫使用subscribeOn和observeOn, 并实现doOnError动作doOnError(() - > showNoInternetConnection())

doOnCompleted从不打电话给间隔!!!

最终代码:

Observable.interval(X, TimeUnit.SECONDS)
            .flatMap(n -> myCall())
            .doOnNext(() -> myStuff())
            .doOnError(() -> showNoInternetConnection())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe()

或者你可以使用订阅这个婴儿车。

Observable.interval(X, TimeUnit.SECONDS)
            .flatMap(n -> myCall())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::myStuff(), this::showNoInternetConnection())

答案 2 :(得分:1)

不幸的是,没有。 完成事件by definition表示流已关闭且无法再预期信号。