作者:独角式恋爱牛仔 | 来源:互联网 | 2023-10-10 09:31
TL;DR如何将Task.whenAll(List)转换为RxJava?我现有的代码使用Bolts构建异步任务列表,并等待所有这些任务完成后再执行其他步骤.基本上,它构
TL; DR
如何将Task.whenAll(List)转换为RxJava?
我现有的代码使用Bolts构建异步任务列表,并等待所有这些任务完成后再执行其他步骤.基本上,它构建了List并返回单个任务,当列表中的所有任务完成时,根据example on the Bolts site标记为已完成.
我正在寻找用RxJava替换Bolts,我假设这种方法可以构建一个异步任务列表(大小未提前知道)并将它们全部包装到一个Observable中,但我不知道如何.
我已经尝试过看看merge,zip,concat等…但是无法在List上工作.如果我理解正确的文档,那么我一直在努力建立起来,因为它们似乎只能同时处理两个Observable.
我正在努力学习RxJava,我仍然很新,所以请原谅我,如果这是一个明显的问题,或者在某个地方的文档中解释过;我试过搜索.任何帮助将非常感激.
解决方法:
听起来你正在寻找Zip operator.
有几种不同的使用方法,让我们看一个例子.假设我们有一些不同类型的简单可观察量:
Observable obs1 = Observable.just(1);
Observable obs2 = Observable.just("Blah");
Observable obs3 = Observable.just(true);
等待它们的最简单方法是这样的:
Observable.zip(obs1, obs2, obs3, (Integer i, String s, Boolean b) -> i + " " + s + " " + b)
.subscribe(str -> System.out.println(str));
请注意,在zip函数中,参数具有与要压缩的可观察对象的类型相对应的具体类型.
也可以直接压缩可观察列表:
List> obsList = Arrays.asList(obs1, obs2, obs3);
Observable.zip(obsList, (i) -> i[0] + " " + i[1] + " " + i[2])
.subscribe(str -> System.out.println(str));
…或者将列表包装成Observable>:
Observable> obsObs = Observable.from(obsList);
Observable.zip(obsObs, (i) -> i[0] + " " + i[1] + " " + i[2])
.subscribe(str -> System.out.println(str));
但是,在这两种情况下,zip函数只能接受单个Object []参数,因为列表中的observable类型事先不知道,也不知道它们的编号.这意味着zip函数必须检查参数的数量并相应地转换它们.
无论如何,所有上述例子最终都会打印出1 Blah true
编辑:使用Zip时,请确保压缩的Observable都发出相同数量的项目.在上面的例子中,所有三个可观察者都发出了一个项目.如果我们要把它们改成这样的东西:
Observable obs1 = Observable.from(new Integer[]{1,2,3}); //Emits three items
Observable obs2 = Observable.from(new String[]{"Blah","Hello"}); //Emits two items
Observable obs3 = Observable.from(new Boolean[]{true,true}); //Emits two items
然后1,Blah,True和2,Hello,True将是传递给zip函数的唯一项目.由于其他可观察物已完成,物品3将永远不会被压缩.