使用背压机制通过分页

时间:2017-03-08 21:59:53

标签: rx-java

我正在尝试使用背压来处理数据分页。我有一个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(但我不能),上部结构的行为也是不合适的。在第一个用户操作之前将请求数据,但我希望在第一个用户操作之后首先请求它。看来我的方法完全错了。

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());