我最近开始使用Rxjava并进行改造,并寻找有关如何执行n次改装后调用以及通过rxjava跟踪它们的任何想法。完成所有操作后,将发生UI事件。
我发现这篇文章:http://randomdotnext.com/retrofit-rxjava/但它使用for循环来启动多个请求可观察对象。也许除了for循环之外还有更优雅的方式?这种努力的最佳rxjava运算符是什么?
答案 0 :(得分:0)
您可以从List / Array创建一个Observable序列,然后使用flatMap / concatMap运算符,而不是使用for循环。
使用for循环:
GithubService service = ServiceFactory.createRetrofitService(GithubService.class, GithubService.SERVICE_ENDPOINT);
for(String login : Data.githubList) {
service.getUser(login)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Github>() {
@Override
public final void onCompleted() {
// do nothing
}
@Override
public final void onError(Throwable e) {
Log.e("GithubDemo", e.getMessage());
}
@Override
public final void onNext(Github response) {
mCardAdapter.addData(response);
}
});
}
Pure Rx:
GithubService service = ServiceFactory.createRetrofitService(GithubService.class, GithubService.SERVICE_ENDPOINT);
Observable.from(Data.githubList)
.flatMap(login -> service.getUser(login))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
答案 1 :(得分:0)
RxJava提供a lot operators来组合多个可观察对象。
在您的情况下,您可以使用运算符merge
,并在onComplete()
答案 2 :(得分:0)
当多个通话依赖于同一件事时,您可以使用平面地图或连续地图来使用您的通话。然后最后更新你的观点。
答案 3 :(得分:0)
使用zip运算符。
例如:
你有3个Retrofit Api并且它们都返回一个字符串,你需要的是3字符串的长字符串合并。
所以你需要等待3 api电话全部返回。并将返回字符串与zip运算符合并。
代码将如下:
Observable.zip(
api1,
api2,
api3,
(resp1, resp2, resp3) -> resp1 + resp2 + resp3
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(resp -> {
// do something
});