Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RxJava-如何停止(和恢复)热可观察(间隔)?_Android_Rx Java_Reactive Programming_Stoppropagation_Rx Java2 - Fatal编程技术网

Android RxJava-如何停止(和恢复)热可观察(间隔)?

Android RxJava-如何停止(和恢复)热可观察(间隔)?,android,rx-java,reactive-programming,stoppropagation,rx-java2,Android,Rx Java,Reactive Programming,Stoppropagation,Rx Java2,我可以观察到以下热点: hotObservable = Observable.interval(0L, 1L, TimeUnit.SECONDS) .map((t) -> getCurrentTimeInMillis())) 然而,我找不到一个好办法来阻止它。我使用takeWhile和boolean标志(runTimer)部分解决了这个问题: 但是,在这种方法中有两件事我不喜欢: 我必须保留标志runTimer,这是我不想要的 一旦ru

我可以观察到以下热点:

hotObservable = Observable.interval(0L, 1L, TimeUnit.SECONDS)
                          .map((t) -> getCurrentTimeInMillis()))
然而,我找不到一个好办法来阻止它。我使用
takeWhile
boolean
标志(
runTimer
)部分解决了这个问题:

但是,在这种方法中有两件事我不喜欢:

  • 我必须保留标志
    runTimer
    ,这是我不想要的
  • 一旦
    runTimer
    变为
    false
    ,可观察对象就完成了,这意味着如果我想再次发射,我需要创建一个新的可观察对象。我不想那样。我只想让可观察到的东西停止发射,直到我告诉它重新开始
  • 我希望有这样的事情:

    hotObservable.stop();
    hotObservable.resume();
    
    这样,我就不需要保留任何标记,可观察对象总是活动的(尽管它可能不会发出事件)


    如何实现这一点?

    一种可能的方法是使用行为主体和开关映射:

    BehaviorSubject<Boolean> subject = BehaviorSubject.create(true);
    hotObservable = subject.distinctUntilChanged().switchMap((on) -> {
        if (on) {
            return Observable.interval(0L, 1L, TimeUnit.SECONDS);
        } else {
            return Observable.never();
        }
    }).map((t) -> getCurrentTimeInMillis());
    
    BehaviorSubject subject=BehaviorSubject.create(true);
    hotObservable=subject.distinctUntilChanged().switchMap((打开)->{
    如果(打开){
    返回可观察间隔(0L、1L、时间单位秒);
    }否则{
    返回可观察。从不();
    }
    }).map((t)->getCurrentTimeInMillis());
    
    通过向对象发送布尔值,可以控制可观察对象的输出
    subject.onNext(true)
    将导致使用该主题创建的任何可观察对象开始发出值
    subject.onNext(false)
    禁用该流

    switchMap
    在关闭时负责处理底层的可观察对象。它还使用
    distinctUntilChanged
    来确保它不会进行不必要的切换。

    Mybe您可以使用它

    Observable.interval(3, TimeUnit.SECONDS)
            .takeUntil(stop)
            .subscribe(new MyObserver());
    
    Thread.sleep(10000);
    stop.onNext(-1);
    

    可观察到的物品应该停止生产,还是继续运行但停止排放?@npace停止生产将是理想的,但我也很乐意只停止排放。这两种方法都适用于我的情况Kiskae的回答完全正确但仅供参考。。如果将上一个解决方案中的
    takeWhile
    运算符替换为
    filter
    运算符,则可以消除第二个缺点。。。
    Observable.interval(3, TimeUnit.SECONDS)
            .takeUntil(stop)
            .subscribe(new MyObserver());
    
    Thread.sleep(10000);
    stop.onNext(-1);