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,改造和多次调用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 RxJava 的“订阅”方法会被多次调用?

RxJava Retrofit2 api 使用 subscribe 或 flatmap 多次调用

RxJava 作为事件总线被多次调用,即使只触发一次

RxJava 和改造的单元测试

使用 Kotlin 进行 RxJava 和改造

带有 rxJava2 和改造的 UndeliverableException