Dar*_*ljo 17 android rx-java rx-android
我正在开发具有后台数据同步功能的Android应用程序.我目前正在使用RxJava定期在服务器上发布一些数据.除此之外,我想为用户提供一个"强制同步"按钮,它会立即触发同步.我知道如何使用Observable.interval()以定期时间间隔推送数据,我知道如何使用它Observalbe.just()来推送那个被强制的数据,但是我想将它们排队,如果发生这种情况,那么在前一个仍然运行的情况下触发它.
所以让我们举个例子,当1min是自动同步的间隔时,让我们说同步持续40秒(我夸张这里只是为了更容易点).现在,如果有任何机会,用户在自动仍在运行时按下"强制"按钮(反之亦然 - 强制一个仍在运行时自动触发),我想将第二个同步请求排队第一个完成.
我画了这张图片,可能会有更多的视角:
如您所见,自动触发(由某些人Observable.interval()),在同步过程中,用户按下"强制"按钮.现在我们要等待第一个请求完成,然后再次启动强制请求.有一次,当强制请求正在运行时,再次触发了新的自动请求,只是将其添加到队列中.从队列中完成最后一个之后,一切都停止了,然后稍后再次安排自动计划.
希望有人能指出我纠正操作员如何做到这一点.我已尝试过Observable.combineLatest(),但是队列列表在开始时被调度,当我向队列添加新的同步时,它在前一个操作完成时没有继续.
Darko,非常感谢任何帮助
aka*_*okd 13
您可以通过将计时器与按钮单击Observable/ 合并Subject,使用排队效果onBackpressureBuffer和concatMap处理到它来确保一次运行一个.
PublishSubject<Long> subject = PublishSubject.create();
Observable<Long> periodic = Observable.interval(1, 1, TimeUnit.SECONDS);
periodic.mergeWith(subject)
.onBackpressureBuffer()
.concatMap(new Func1<Long, Observable<Integer>>() {
@Override
public Observable<Integer> call(Long v) {
// simulates the task to run
return Observable.just(1)
.delay(300, TimeUnit.MILLISECONDS);
}
}
).subscribe(System.out::println, Throwable::printStackTrace);
Thread.sleep(1100);
// user clicks a button
subject.onNext(-1L);
Thread.sleep(800);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6338 次 |
| 最近记录: |