我想到以下情况:我想有一个计时器计数直到我取消订阅,但我想在最后一个值停止后获得 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通知停止排放,但您刚刚说您对它发出的内容不感兴趣,因此您没有收到它。