rxjava interval() reset time after some event
我正在用RxJava制作一个Android应用程序,在其中一个页面中,我有一个按钮,当按下该按钮时,页面将刷新。 而且我还希望每10秒自动刷新一次,前提是用户在这段时间内没有按下按钮。 但是,当用户单击按钮时,我希望自动刷新动作在单击后10秒钟后发生。 而不是继续自己的10秒间隔。
例如,在第二秒0时,应用程序执行自动刷新,然后在第二秒3时,用户按下按钮。 然后,自动刷新应在第13、23、23等发生。
我知道有一个
1 2 3 4 | Observable<Long> intervalObservable = Observable.inteval(10, TimeUnit.SECONDS) RxView.click(refreshButton).map(ignored -> 0L) .merge(intervalObservable) .subscibe(ignore -> performRefresh()); |
如果有一种方法可以"取消合并"
我该如何实现?
您可以使用
1 2 3 4 5 6 7 8 9 10 | 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(); |
更新:vman注意到该实现仅在用户第一次单击按钮后才开始刷新。以下替代方法将在订阅后立即刷新,然后每10秒钟刷新一次,直到单击该按钮为止;此时,它将再次立即刷新,然后每10秒钟继续更新一次。
1 2 3 4 5 6 7 8 9 10 11 12 | 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(); |
在此实现中,进行刷新的Observable立即被订阅(导致立即刷新,并每10秒重复一次),它与Observable合并,每当单击刷新按钮时,该Observable都会出错。最后的
最简单的解决方案是不是您每次单击按钮都取消订阅旧的可观察项并再次订阅?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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(); } } |