转载请以链接形式标明出处:
本文出自:103style的博客
转换相关的操作符 以及 官方介绍
RxJava
之 flatMap
系列 转换操作符 官方介绍 :Transforming Observables
flatMap
flatMapCompletable
flatMapIterable
flatMapMaybe
flatMapObservable
flatMapPublisher
flatMapSingle
flatMapSingleElement
以下介绍我们就直接具体实现,中间流程请参考 RxJava之create操作符源码解析。
flatMap
- 官方示例:
输出:Observable.just("A", "B", "C") .flatMap(a -> { return Observable.intervalRange(1, 3, 0, 1, TimeUnit.SECONDS) .map(b -> '(' + a + ", " + b + ')'); }) .blockingSubscribe(System.out::println);
(A, 1) (C, 1) (B, 1) (A, 2) (C, 2) (B, 2) (A, 3) (C, 3) (B, 3)
- 返回对象的
ObservableFlatMap
的subscribeActual
方法:public void subscribeActual(Observer<? super U> t) { if (ObservableScalarXMap.tryScalarXMapSubscribe(source, t, mapper)) { return; } source.subscribe(new MergeObserver<T, U>(t, mapper, delayErrors, maxConcurrency, bufferSize)); }
-
MergeObserver
的onNext
方法:public void onNext(T t) { // safeguard against misbehaving sources ... subscribeInner(p); } void subscribeInner(ObservableSource<? extends U> p) { for (;;) { if (p instanceof Callable) { ... drain(); ... } else { InnerObserver<T, U> inner = new InnerObserver<T, U>(this, uniqueId++); if (addInner(inner)) { p.subscribe(inner); } break; } } }
-
InnerObserver
的onNext
方法:public void onNext(U t) { if (fusionMode == QueueDisposable.NONE) { parent.tryEmit(t, this); } else { parent.drain(); } }
-
MergeObserver
的drain()
方法:
最终还是调用了 传进来的void drain() { if (getAndIncrement() == 0) { drainLoop(); } } void drainLoop() { final Observer<? super U> child = this.downstream;//1.0 int missed = 1; for (;;) { ... SimplePlainQueue<U> svq = queue; if (svq != null) { for (;;) { ... U o = svq.poll(); if (o == null) { break; } child.onNext(o);//1.1 } } ... if (d && (svq == null || svq.isEmpty()) && n == 0 && nSources == 0) { Throwable ex = errors.terminate(); if (ex != ExceptionHelper.TERMINATED) { if (ex == null) { child.onComplete();//1.2 } else { child.onError(ex);//1.3 } } return; } ... } }
observer
的 对应方法。
转载于:https://www.jianshu.com/p/191a8680b8cc