android - 停止 Observable.interval 并发送 onComplete

标签 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 做到吗?我觉得我做错了什么?

最佳答案

@MatBos 是正确的,如果您取消订阅,您就不能期望完成发射。但是,如果您想尽早停止 observable 并让它完成,您可以将间隔与 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

关于android - 停止 Observable.interval 并发送 onComplete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38230530/

相关文章:

java - 如果包含其他数据则显示列表 AlertDialog

android - 如何在 KitKat 中将文件写入可移动 SD 卡(不是外部 SD 卡)?

android - 如何在运行时设置按钮layout_marginTop/layout_marginBottom?

android - 在 Rx 链中多次切换线程

android - ListView 多选问题?

java - 没有数据的 RxJava2 主题

android - Github API 从目录获取文件数据

java - RxJava : Call network multiple times with increasing delay, 忽略错误

安卓-java.io.IOException : Canceled when disposed

android - 如何更改android进度条粗细