【问题标题】:Rxjava, retrofit and multiple callsRxjava,改造和多次调用
【发布时间】:2016-11-24 12:04:46
【问题描述】:

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

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

【问题讨论】:

    标签: android retrofit rx-java


    【解决方案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
                        });
        

        【讨论】:

          猜你喜欢
          • 2020-11-11
          • 1970-01-01
          • 2020-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-05
          • 2016-03-27
          • 1970-01-01
          相关资源
          最近更新 更多