停止Observable.interval并发送onComplete

时间:2016-07-06 17:49:54

标签: android rx-java

我有以下几种情况:我希望有一个计时器计数,直到我取消订阅但我希望在我停止使用最后一个值时得到onComplete信号。

observable = Observable.interval(1, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .doOnNext(new Action1<Long>() {
                @Override
                public void call(Long aLong) {
                    String duration = Utils.getDuration(startedTrackingTime, new Date().getTime());
                    view.updateDurationTextView(duration);
                }
            });

    subscription = observable.subscribe();



public void stopMission() {
        observable.doOnCompleted(new Action0() {
            @Override
            public void call() {
                Log.d(TAG, "onCompleted: " + "timer");
            }
        });

        subscription.unsubscribe();

doOnComplete从未调用过。可以用RxJava做到吗?我觉得我做错了什么?

3 个答案:

答案 0 :(得分:4)

@MatBos是正确的,如果你取消订阅,你不能指望完成排放。但是,如果您想提前停止观察并完成它,您可以将间隔与PublishSubject合并,并在需要时通过主题发送停止消息:

PublishSubject<Long> subject = PublishSubject.create();
subject
    .mergeWith(Observable.interval(1, TimeUnit.SECONDS)) 
    .takeWhile(n -> n != -1) 
    .doOnNext(System.out::println) 
    .doOnCompleted(() -> System.out.println("completed"))
    .subscribe();
Thread.sleep(3100);
subject.onNext(-1L);
Thread.sleep(2000);

给出:

0
1
2
completed

答案 1 :(得分:1)

Interval observable是无限的,因此永远不会完成。我建议您使用doOnUnsubscribe代替doOnCompleted停止回调。

答案 2 :(得分:0)

onComplete的定义:

  

如果没有遇到任何错误,Observable在最后一次调用onNext 之后调用此方法

当您致电取消订阅时,您只会停止接收排放。 因此,observable可以通过onNext继续发出项目,或者通过onComplete / onError通知停止发射,但你刚才说你对它发出的内容不感兴趣所以你没有收到它。