我需要一些帮助来实现RxJava中的并行异步调用。我已经选择了一个简单的用例,其中第一个调用获取(而不是搜索)要显示的产品列表(Tile)。随后的调用输出并获取(A)REVIEWS和(B)PRODUCT IMAGES
经过几次尝试,我终于到了这个地方。
第1行:取出要显示的产品(平铺)
第4行:我们获取Observable的列表并将其SHARD以获取评论和imageUrls
谎言6,7:获取可观察评论和可观察url
第8行:最后,压缩2个Observable以返回更新后的Observable
第15行:最后,第15行整理要在集合中显示的所有单个产品,该集合可以返回到调用层
虽然观察已被分割,并在我们的测试运行在4个不同的线程;评论和图片的获取似乎是一个接一个的。我怀疑第8行的zip步骤基本上导致了2个可观察对象(评论和URL)的顺序调用。
这个小组有没有建议并行获取评论和图片的网址?本质上,上面的瀑布图应该看起来更垂直堆叠。对评论和图片的调用应该是并行的
谢谢阿南德·拉曼
2条答案
按热度按时间lx0bsm1f1#
并行运算符被证明是几乎所有用例的一个问题,并且不能实现大多数人的期望,因此在1.0.0.rc.4版本中将其删除:https://github.com/ReactiveX/RxJava/pull/1716
here是一个很好的例子,说明了如何执行这种行为并获得并行执行。
在你的示例代码中,
searchServiceClient
是同步的还是异步的并不清楚。这稍微影响了如何解决问题,就好像它已经是异步的了,不需要额外的调度。如果是同步的,就需要额外的调度。首先,下面是一些简单的示例,显示同步和异步行为:
下面尝试提供一个与您的代码更匹配的示例:
这将输出:
我已经模拟了每个IO调用花费1000ms,所以很明显延迟在哪里,并且它是并行发生的。它打印出了以毫秒为单位的进度。
这里的技巧是flatMap合并异步调用,因此只要被合并的Observable是异步的,它们就都将并发执行。
如果像
getProductImage(t.getProductId())
这样的调用是同步的,则可以像下面这样使其异步:获取产品映像(t.获取产品ID()).订阅打开(调度程序. io).下面是上面示例的重要部分,其中不包括所有日志和样板类型:
z9ju0rcb2#
那些仍然是@ JDK 7的人,那些IDE还没有自动检测JDK 8源代码的人,以及那些想尝试@benjchristensen上面精彩回应(和解释)的人,都可以使用这个无耻的重复,JDK 7,代码。