如何划分两个同时发射的事件流并处理它们?

时间:2016-08-25 21:15:57

标签: java android rx-java

有一串随机数。

rx.Observable
.range (0, 1000)
.map (() -> 200d * Math.random ())

我需要将流程分成两部分。数字小于100且数字超过100。

之后,对于小于100的数字(chain1): 我需要对网络执行request1,等待答案并继续其他运营商的流程链1。

对于超过100的数字(chain2): 我必须发送另一个request2,等待答案并继续进行流程链操作。

request1request2不会互相等待,链并行执行。但在链中,处理必须等待对请求的响应。

怎么做?

1 个答案:

答案 0 :(得分:0)

rx.Observable
                        .create(subscriber -> {
                            for (int i = 0; i < 100; i++) {
                                subscriber.onNext(i);
                                Log.i("Iniop", "Create thread name: " + Thread.currentThread().getName());
                            }
                            subscriber.onCompleted();
                        })
                        .onBackpressureBuffer()
                        .observeOn(Schedulers.computation())
                        .subscribeOn(Schedulers.computation())
                        .map(v -> {
                            Log.i("Iniop", "Map thread name: " + Thread.currentThread().getName());
                            return 200d * Math.random();
                        })
                        .groupBy(k -> {
                                    Log.i("Iniop", "Group thread name: " + Thread.currentThread().getName());
                                    return k > 100 ? "yes" : "no";
                                }
                                , v -> v)
                        .forEach(gO -> gO.observeOn(Schedulers.newThread())
                                        .map(v -> new Pair<String, Double>(gO.getKey(), v))
                                        .subscribe(v -> {
                                                    Log.i("Iniop", "Key: " + v.first);
                                                    Log.i("Iniop", "Value: " + v.second);
                                                    Log.i("Iniop", "Thread name: " + Thread.currentThread().getName());
                                                }
                                                , e -> Log.e("Iniop", "Err", e))
                                , e -> Log.e("Iniop", "Err", e));