Rxjava,改造和多次通话

时间:2016-07-21 04:44:29

标签: android retrofit rx-java

我最近开始使用Rxjava并进行改造,并寻找有关如何执行n次改装后调用以及通过rxjava跟踪它们的任何想法。完成所有操作后,将发生UI事件。

我发现这篇文章:http://randomdotnext.com/retrofit-rxjava/但它使用for循环来启动多个请求可观察对象。也许除了for循环之外还有更优雅的方式?这种努力的最佳rxjava运算符是什么?

4 个答案:

答案 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()

处执行UI工作

答案 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
                });