我正在尝试使用背压来处理数据分页。我有一个observable,它为每个请求(N)从服务器请求N个新的数据块。我想在用户点击按钮后获取一大块新数据。
我的主要目标是用Observable合同替换这个api
interface Api {
void openConnection(); //subscription
boolean hasNextPage(); //completion
Single<Data> nextPage();//onNext and onError
void closeConnection(); //unsubscription
}
我认为zip在这里会很棒
Observable.zip(dataFromServer(), userActions(), (data, ø) -> data).subscribe(showData());
但由于RxRingBuffer在zip运算符中的大小为M,因此订阅后的上层构造会立即从服务器请求M块数据。这完全不合适。即使我可以将缓冲区大小更改为1(但我不能),上部结构的行为也是不合适的。在第一个用户操作之前将请求数据,但我希望在第一个用户操作之后首先请求它。看来我的方法完全错了。
答案 0 :(得分:1)
我设法完成了适当的行为。
//model of user actions
val userActions = Observable.interval(1000, TimeUnit.MILLISECONDS).share();//user clicks every second//
//model of my observable with data which supports backpressure
val dataFromServer = Observable.range(1, 10);//data has 10 pages//
dataFromServer
.doOnNext(it -> System.out.println("Received from server" + it))
.flatMap(it -> userActions.take(1).ignoreElements().startWith(it), 1)
.doOnNext(it -> System.out.println("Before data showing" + it))
.subscribe(showData());