我正在考虑将我的 Android 应用程序转换为使用 Rxjava 进行网络请求。我目前访问的网络服务类似于:
getUsersByKeyword(String query, int limit, int offset)
据我了解,Observables 是一个“推”接口,而不是一个“拉”接口。所以这就是我对解决问题的理解:
- 应用程序向服务注册,获取 Observable 进行查询
- 结果被推送到应用程序
- 应用程序处理结果
- 当应用程序想要更多结果时......?
这就是我的事情崩溃的地方。以前我只是向网络服务询问我想要的内容,然后使用偏移量再次进行查询。但在这种情况下,这将涉及创建另一个 Observable 并订阅它,这有点违背了这一点。
我应该如何处理应用程序中的分页? (这是一个 Android 应用程序,但我认为这不相关)。
这是硬摇滚!)
所以我们有网络请求:
getUsersByKeyword(String query, int limit, int offset)
这个请求返回例如
List< Result >
如果我们使用 RetroFit 进行联网,该请求将如下所示:
Observable< List< Result >> getUsersByKeyword(String query, int limit, int offset)
结果我们想要得到所有Result
来自服务器。
所以它会看起来像这样
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) {
}
});
代码已测试!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)