停止 Observable.interval 并发送 onComplete



我想到以下情况:我想有一个计时器计数直到我取消订阅,但我想在最后一个值停止后获得 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();

嘟从未打过电话。可以使用RxJava吗?我觉得我做错了什么?

@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

可观察的区间是无限的,因此永远不会完成。我建议使用 doOnUnsubscribe 而不是 doOnCompleted 进行停止回调。

onComplete的定义:

如果 Observable 在最后一次调用 onNext(如果未遇到任何错误)后调用此方法。

当您要求取消订阅时,您只会停止接收排放。因此,可观察对象可能会继续通过onNext发出项目,或者通过onComplete/onError通知停止排放,但您刚刚说您对它发出的内容不感兴趣,因此您没有收到它。

相关内容

  • 没有找到相关文章

最新更新