[英]Rxjava, retrofit and multiple calls
我最近开始使用Rxjava和Retrofit,并寻找有关如何执行n个Retropost调用并通过rxjava进行跟踪的任何想法。 一旦完成所有动作,便会发生UI事件。
我找到了这篇文章: http : //randomdotnext.com/retrofit-rxjava/,但是它使用for循环来启动多个请求可观察对象。 也许除了for循环外还有一种更优雅的方式? 这种工作最好的rxjava运算符是什么?
可以使用List / Array创建一个Observable序列,而不是使用for循环,然后使用flatMap / concatMap运算符。
使用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);
}
});
}
纯接收:
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(...);
RxJava提供了很多运算符来组合多个可观察对象。
在您的情况下,您可以使用运算符merge
,并在onComplete()
执行UI工作
当多个呼叫取决于同一件事时,您可以使用平面地图或连续地图来利用您的呼叫。 然后最后更新您的视图。
使用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
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.