Rxjava,改造和多次调用
Posted
技术标签:
【中文标题】Rxjava,改造和多次调用【英文标题】:Rxjava, retrofit and multiple calls 【发布时间】:2016-11-24 12:04:46 【问题描述】:我最近开始使用 Rxjava 和改造,并寻找有关如何执行 n 次改造后调用并通过 rxjava 跟踪它们的任何想法。完成所有操作后,将发生 UI 事件。
我发现这篇文章:http://randomdotnext.com/retrofit-rxjava/ 但是它使用 for 循环来启动多个请求 observables。除了 for 循环之外,也许还有更优雅的方式?这种工作最好的 rxjava 运算符是什么?
【问题讨论】:
【参考方案1】:您可以从 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(...);
【讨论】:
【参考方案2】:RxJava 提供a lot operators 来组合多个可观察对象。
在您的情况下,您可以使用运营商merge
,并在onComplete()
处进行UI 工作
【讨论】:
【参考方案3】:当多个调用依赖于同一事物时,您可以使用平面图或连续图来利用您的调用。然后最后更新你的视图。
【讨论】:
你有没有使用 concat 进行多次网络调用的例子【参考方案4】:使用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
);
【讨论】:
以上是关于Rxjava,改造和多次调用的主要内容,如果未能解决你的问题,请参考以下文章