繁体   English   中英

Rxjava,改造和多次调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM