当前位置: 首页 > 知识库问答 >
问题:

android RxJava可见。从发送到服务

张瀚漠
2023-03-14

我有一个项目列表,需要提取一些值并为每个项目调用api。为了做到这一点,我用了这样的东西_

Observable.from(myList)
   .flatMap{ item ->
      return serviceInteractor.uploadToServer(item)
   }
   .map { serverResponse ->
       return serverResponse.getResponseCode
   }
   .toList()
   .subscrible{ responseList ->
   // do something with all the responses
   }

好吧,问题是,我不知道为什么所有的调用都是并行的。难道它不应该等待第一个响应,映射结果,然后从可观察到的对象开始下一个项目吗。from()并在最后返回responseMessages的最终列表?正在发生的是,一切都同时发生。为了证实这一点,如果我在toList方法之前加上一个延迟(1,TimeUnit.Seconds),那么所有事情都同时发生,只有最后的onNext被延迟。

我怎样才能做到这一点?有一个ID列表,要逐个上载到服务器,等待每个ID完成,如果成功或失败,请继续下一步

共有2个答案

燕雨石
2023-03-14

是的,您需要使用ConcatMap

平面贴图使用合并操作符,而concatMap使用concat操作符。

所以序列是这样的

flatMap输出序列已合并,concatMap输出序列已排序

如本答案所述

在这里你可以看看这个例子

String arrData[] = {"0", "1", "2", "3", "4"};
Integer arrDelay[] = {1000, 6000, 4000, 9000, 2000};

Observable.from(arrData)
            .concatMap(s -> Observable.from(arrData)
                      .delay(arrDelay[Integer.parseInt(s)],TimeUnit.MILLISECONDS))

            .map(integer -> integer)
            .toList()
            .doOnCompleted(() -> Log.v("log", "doOnCompleted"))
            .subscribe(integer -> Log.v("log", "" + integer));

在这里,您可以检查延迟是否为我们使用的项目的总延迟

我知道我已经迟了回答这个问题:)

辛渝
2023-03-14

flatMap将“堆叠”调用。它将订阅每个可观察结果,然后按照它们到达的顺序发出结果。因此,可能无法订购结果(cf文档)。

如果希望对结果进行排序,应该查看concatMap操作符。(见文件)

Observable.from(myList)
     .concatMap{ item ->
              return serviceInteractor.uploadToServer(item)
      }
     .map { serverResponse ->
         return serverResponse.getResponseCode
      }
     .toList()
     .subscrible{ responseList ->
         // do something with all the responses
     }

你可以通过这篇博文获得更多信息。

 类似资料:
  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

  • 我一直在做这个项目,其中一个部分包括从Raspberry向我的服务器发送一些数据。但它不能正常工作,我不知道为什么。我试图通过删除“urllib2”并使用“request”来修复错误。但徒劳的是,一切都没有改变。如果有人能帮助我,我会非常感激的。谢谢! PHP代码: python代码:

  • 问题内容: 我在通过Notification从服务向活动发送数据时遇到问题,我单击了一个活动被调用的通知,但是当我尝试通过捆绑包添加一些参数时,我无法获得所谓的intent中的参数,我经历了链接 如何将通知单击中的参数发送到活动? 但是仍然没有运气。 其他人也发生过同样的问题吗? 提前致谢。 问题答案: 您还必须修改清单文件。 这是有效的示例: 这些变量和方法是Service类的成员: 这是Mai

  • 问题内容: 我有MySQL数据库服务器 我需要通过JSON更新和检索MySQL服务器中的数据 所以,我想知道如何做到这一点,并且让这个示例语句感到困惑: 这意味着我需要先编写与PHP服务器连接的应用程序代码,然后再编写php以连接数据库。 问题答案: 要将数据发送到服务器,您可以执行以下操作: 然后发送让说: 因此服务器上的AddAccelerationData.php文件为: 这是我最近使用的示

  • 问题内容: 首先,我将请求的文件从服务器发送到客户端,然后再将文件的计算出的sha从服务器发送到客户端,以便客户端可以检查发送文件和接收文件中的sha是相同的。 我设法发送了文件,但是当我尝试也发送sha(这是一个变量)时,我收到一个错误消息(我相信sha也已添加到文件内容中) 如何分别发送? 和客户: 问题答案: 您应该重新设计应用程序的工作方式: 首先,服务器将文件大小发送给客户端 客户端读取

  • 问题内容: 我想使用Android将数据发送到我的php页面。我该怎么做? 问题答案: 您可以使用AndroidHttpClient进行GET或POST请求: 创建一个AndroidHttpClient来执行您的请求。 创建一个HttpGet或HttpPost请求。 使用setEntity和setHeader]方法填充请求。 对您的请求使用客户端上的execute方法之一。