问题描述
我正在考虑将我的 android 应用程序转换为使用 Rxjava 进行网络请求.我目前访问的网络服务类似于:
I'm looking into converting my android app to use Rxjava for network requests. I currently access a webservice similar to:
getUsersByKeyword(String query, int limit, int offset)
据我所知,Observables 是一个推"而不是拉"接口.所以我是这样理解要解决的问题的:
As I understand it, Observables are a "push" rather than a "pull" interface. So here's how I understand things to work out:
- 应用向服务注册,获取 Observable 以供查询
- 结果被推送到应用
- 应用处理结果
- 当应用想要更多结果时......?
这就是我崩溃的地方.以前,我只会向网络服务询问我想要的内容,然后使用偏移量再次进行查询.但在这种情况下,这将涉及创建另一个 Observable 并订阅它,这有点违背了这一点.
This is where things break down for me. Previously I would just ask the webservice for exactly what I want, make the query again with the offset. But in this case that would involve creating another Observable and subscribing to it, kind of defeating the point.
我应该如何处理我的应用程序中的分页?(这是一个安卓应用,但我认为这无关紧要).
How should I handle paging in my app? (It's an android app, but I don't think that is relevant).
推荐答案
太难了!)所以我们有网络请求:getUsersByKeyword(String query, int limit, int offset)
这个请求返回例如
列表
如果我们使用 RetroFit 进行网络连接,该请求将如下所示:可观察的<列表> getUsersByKeyword(String query, int limit, int offset)
因此,我们希望从服务器获取所有 Result
.
所以它看起来像这样
It was hard rock!)So we have request to network: getUsersByKeyword(String query, int limit, int offset)
and this request return for example List< Result >
If we use RetroFit for networking that request will look: Observable< List< Result >> getUsersByKeyword(String query, int limit, int offset)
As result we want to get all Result
from server.
So it will look like this
int page = 50;
int limit = page;
Observable
.range(0, Integer.MAX_VALUE - 1)
.concatMap(new Func1<Integer, Observable<List<Result>>>() {
@Override
public Observable<List<Result>> call(Integer integer) {
return getUsersByKeyword(query, integer * page, limit);
}
})
.takeWhile(new Func1<List<Result>, Boolean>() {
@Override
public Boolean call(List<Result> results) {
return !results.isEmpty();
}
})
.scan(new Func2< List<Result>, List<Result>, List<Result>>() {
@Override
public List<Result> call(List<Result> results, List< Result> results2) {
List<Result> list = new ArrayList<>();
list.addAll(results);
list.addAll(results2);
return list;
}
})
.last()
.subscribe(new Subscriber<List<Result>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<Results> results) {
}
});
代码已经过测试!
这篇关于如何使用 RxJava 处理分页?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!