rxjava interval()在某些事件后重置时间

rxjava interval()在某些事件后重置时间,java,android,rx-java,rx-android,Java,Android,Rx Java,Rx Android,我正在用RxJava制作一个Android应用程序,在其中一个页面中,我有一个按钮,按下时,页面将刷新。我还希望每10秒自动刷新一次,如果用户在这段时间内没有按下按钮。但当用户单击按钮时,我希望自动刷新操作在单击10秒后发生。而不是继续它自己的10秒间隔。 例如,在第0秒,应用程序自动刷新,然后在第3秒,用户按下按钮。然后自动刷新应该发生在第13秒、第23秒等。 我知道有一个interval()操作符,它以特定的间隔发出项目。但似乎没有办法“重置”开始时间。这有点像取消订阅并再次订阅可观察到的i

我正在用RxJava制作一个Android应用程序,在其中一个页面中,我有一个按钮,按下时,页面将刷新。我还希望每10秒自动刷新一次,如果用户在这段时间内没有按下按钮。但当用户单击按钮时,我希望自动刷新操作在单击10秒后发生。而不是继续它自己的10秒间隔。 例如,在第0秒,应用程序自动刷新,然后在第3秒,用户按下按钮。然后自动刷新应该发生在第13秒、第23秒等。 我知道有一个
interval()
操作符,它以特定的间隔发出项目。但似乎没有办法“重置”开始时间。这有点像取消订阅并再次订阅可观察到的
interval()。一段代码就像

Observable<Long> intervalObservable = Observable.inteval(10, TimeUnit.SECONDS)
RxView.click(refreshButton).map(ignored -> 0L)
      .merge(intervalObservable)
      .subscibe(ignore -> performRefresh());
Observable intervalObservable=Observable.inteval(10,时间单位:秒)
RxView.单击(刷新按钮).映射(忽略->0L)
.合并(间隔可观察)
.subscibe(忽略->性能刷新());
如果有办法“取消合并”intervalObservable
,那么我可以在
onNext
中取消合并,然后再次合并。但似乎没有。
如何实现这一点?

最简单的解决方案不是每次单击按钮都取消订阅旧的observable并再次订阅

   Subscription subscription= null;  
   Observable<Long> interval = nul;


 public void subscribe(){

    interval = Observable
            .interval(10000L, TimeUnit.MILLISECONDS);
    subscription = interval.subscribe(item -> System.out.println("doing something")); 

}

public void eventClick(){
    if(clickButtin){
        subscription.unsubscribe();
        subscribe();
    }
}
Subscription=null;
可观测区间=nul;
公开无效订阅(){
间隔=可观察
.间隔(10000L,时间单位为毫秒);
订阅=interval.subscribe(item->System.out.println(“做某事”);
}
public void eventClick(){
如果(单击输入){
订阅。取消订阅();
订阅();
}
}

您可以使用
switchMap
操作符很好地完成这项工作。每次按下按钮,它都会切换到新的可观测间隔订阅,这意味着它将重新开始。上一个订阅将自动删除,因此不会有多个间隔运行

Observable<Long> intervalObservable = Observable.interval(10, TimeUnit.SECONDS);

RxView.clicks(refreshButton)
    .switchMap(ignored -> {
        return intervalObservable
            .startWith(0L)                 // For an immediate refresh
            .observeOn(AndroidSchedulers.mainThread())
            .doOnNext(x -> performRefresh());
    })      
    .subscribe();

在这个实现中,一个执行刷新的可观察对象立即被订阅(导致立即刷新,并每10秒重复一次),它与一个可观察对象合并,每当单击刷新按钮时,该可观察对象就会出错。最后的
重试
会导致整个事件在出现错误时被重新订阅(按钮点击)–导致一切重新开始。

我考虑过这一点,但我如何才能以更“流”的方式做到这一点?我已经从点击事件中创建了一个可观察的对象,并将其与
间隔
可观察的对象合并。请参阅更新的问题描述。如果evenClick是另一个可观察到的,那么您可以始终以功能性的方式进行操作,如果不是,我将使用此方法。这正是我想要的!谢谢大家!@patrick bacon你仍然需要OP编写的合并,以防没有点击,这样间隔在10分钟内仍然会触发,对吗?@vman-我没有意识到它应该每10秒刷新一次,即使从未点击过按钮。这将使它变得更加复杂,但它仍然是可行的。我会看看是否可以更新我的答案,让第二个例子支持这一点。抢手货
Observable<Long> intervalObservable = Observable.interval(10, TimeUnit.SECONDS)
    .startWith(0L)  // For an immediate refresh
    .observeOn(AndroidSchedulers.mainThread())
    .doOnNext(x -> performRefresh());

Observable<Long> buttonClickedObservable = RxView.clicks(refreshButton)
    .map(e -> 0L)  // To make the compiler happy
    .switchMap(ignored -> Observable.error(new RuntimeException("button pressed")));

Observable.merge(intervalObservable, buttonClickedObservable)
    .retry()
    .subscribe();