我有以下几种情况:我希望有一个计时器计数,直到我取消订阅但我希望在我停止使用最后一个值时得到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做到吗?我觉得我做错了什么?
答案 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通知停止发射,但你刚才说你对它发出的内容不感兴趣所以你没有收到它。