【问题标题】:How to execute a list of observables in parallel and collect the result如何并行执行可观察对象列表并收集结果
【发布时间】:2017-12-12 05:49:53
【问题描述】:

如果有 Observables 的列表,例如:

Observable<Msg> obs1 = getObs1();
Observable<Msg> obs2 = getObs2();

List<Observable<Msg>> listOfObs = new ArrayList<Observable<Msg>>();
listOfObs.add(obs1);
listOfObs.add(obs2);

Observabke allObs = Observable.zip(observableListOfEntries, new FuncN<List<Message2>>() {
        @Override
        public List<Msg> call(Object... args) {
            List<Msg> message2List = new ArrayList<Msg>();
            for (Object obj : args) {
                message2List.add((Message2) obj);
                Log.d("Msg>>>", ((Msg) obj).getMsg());
            }
            return message2List;
        }
    });

我使用了之前的代码,但似乎有问题,因为日志消息从未打印出来。我应该怎么做才能执行列表中的所有可观察对象?

【问题讨论】:

  • 请在 obs1 和 obs2 上用作 doOnNext 以记录项目。看起来给定的 observabeles 之一没有发出任何值。
  • 感谢@HansWurst 的评论,这是我的错,所有可观察的发射值,问题是我在主线程上调用网络操作:))) !!愚蠢的我!

标签: rx-java rx-android


【解决方案1】:
    Observable<Msg> obs1 = getObs1();
    Observable<Msg> obs2 = getObs2();

    List<Observable<Msg>> listOfObs = new ArrayList<Observable<Msg>>();
    listOfObs.add(obs1.subscribeOn(Schedulers.io()));
    listOfObs.add(obs2.subscribeOn(Schedulers.io()));

    Observable allObs = Observable.zip(listOfObs, new FuncN<List<Msg>>() {
        @Override
        public List<Msg> call(Object... args) {
            List<Msg> message2List = new ArrayList<Msg>();
            for (Object obj : args) {
                message2List.add((Msg) obj);
                Log.d("Msg>>>", ((Msg) obj).getMsg());
            }
            return message2List;
        }
    });
    allObs.toBlocking().single();

【讨论】:

  • 使用 subscribeOn 在单独的线程上运行进程。不要忘记 toBlocking().single() 或 .subscribe() 来实际运行进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
相关资源
最近更新 更多