Rxjava操作符源码分析
来源:互联网 发布:echart java maven 编辑:程序博客网 时间:2024/06/06 03:13
just():
//这里的变换 a 的值时为了说明下面的 defer() 操作符 a = 10; Observable<Integer> justObservable = Observable.just(a); a = 12; justObservable.subscribe(new Consumer<Integer>() { @Override public void accept(@NonNull Integer integer) throws Exception { Log.i("TAG", "accept: " + integer); } });
输出:
accept: 10
分析:
public static <T> Observable<T> just(T item) { ObjectHelper.requireNonNull(item, "The item is null"); return RxJavaPlugins.onAssembly(new ObservableJust<T>(item)); }
第一行是判空 , 第二行的RxjavaPlugins是为了实现hook , 下面都会忽略这两个 .
返回的是 new ObservableJust<T>(item)
public final class ObservableJust<T> extends Observable<T> implements ScalarCallable<T> { private final T value; public ObservableJust(final T value) { this.value = value; } @Override protected void subscribeActual(Observer<? super T> s) { ScalarDisposable<T> sd = new ScalarDisposable<T>(s, value); s.onSubscribe(sd); sd.run(); }}
这里跳过了很多细节 , 为的只是将操作符的实现 . 具体可以自己去看源码 .
ObservableJust将我们传过来的 a 存在 ObservableJust对象当中 . 所以 just() 操作符返回的是一个 持有我们传过去的 a 的ObservableJust对象 . 当订阅之后会执行相应的方法 .
defer():
a = 10;Observable<Integer> deferObservable = Observable.defer(new Callable<ObservableSource<? extends Integer>>() { @Override public ObservableSource<? extends Integer> call() throws Exception { return Observable.just(a); }});a = 12;deferObservable.subscribe(new Consumer<Integer>() { @Override public void accept(@NonNull Integer integer) throws Exception { Log.i("TAG", "accept: " + integer); }});
输出:
accept: 12
分析:
defer() 中传过去的是一个callable对象 .
public static <T> Observable<T> defer(Callable<? extends ObservableSource<? extends T>> supplier) { ObjectHelper.requireNonNull(supplier, "supplier is null"); return RxJavaPlugins.onAssembly(new ObservableDefer<T>(supplier)); }
public final class ObservableDefer<T> extends Observable<T> { final Callable<? extends ObservableSource<? extends T>> supplier; public ObservableDefer(Callable<? extends ObservableSource<? extends T>> supplier) { this.supplier = supplier; }}
返回了ObservableDefer对象 , 存入了callable .
@Override public void subscribeActual(Observer<? super T> s) { ObservableSource<? extends T> pub; try { pub = ObjectHelper.requireNonNull(supplier.call(), "null publisher supplied"); } catch (Throwable t) { Exceptions.throwIfFatal(t); EmptyDisposable.error(t, s); return; } pub.subscribe(s); }
当订阅方法执行的时候 , 会调用 callable的call() 方法 获取我们在call()方法中返回的 ObservableSource , 接着调用 ObservableSource 的 subscribe()方法 , 相继调用onNext()等方法 , defer()方法是懒加载创建被观察者 , 所以在 a 变换之后 , 返回的也是变换过后的 a .
fromArray():
@CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) public static <T> Observable<T> fromArray(T... items) { ObjectHelper.requireNonNull(items, "items is null"); if (items.length == 0) { return empty(); } else if (items.length == 1) { return just(items[0]); } return RxJavaPlugins.onAssembly(new ObservableFromArray<T>(items)); }
fromArray()方法 , 如果是空的 , 返回一个空的被观察者 , 如果只有一个 , 那么调用 Observable.just()方法 , 如果长度 > 1 返回一个ObservableFromArray对象 .
public final class ObservableFromArray<T> extends Observable<T> { final T[] array; public ObservableFromArray(T[] array) { this.array = array; }}
ObservableFromArray 引用者数组 .
public void subscribeActual(Observer<? super T> s) { FromArrayDisposable<T> d = new FromArrayDisposable<T>(s, array); s.onSubscribe(d); if (d.fusionMode) { return; } d.run(); }
订阅之后 , 会调用FromArrayDisposable的 run()方法
void run() { //我们传过来的数组 T[] a = array; int n = a.length; for (int i = 0; i < n && !isDisposed(); i++) { T value = a[i]; if (value == null) { actual.onError(new NullPointerException("The " + i + "th element is null")); return; } actual.onNext(value); } if (!isDisposed()) { actual.onComplete(); } }
这里利用 for 循环 , 获取值 , 并且调用onNext()方法 , 如果值为null , 停止循环并且调用onError()方法 .
fromIterable() 也一样 , 是利用 Iterator 来遍历 .
interval():
@CheckReturnValue @SchedulerSupport(SchedulerSupport.CUSTOM) public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit, Scheduler scheduler) { ObjectHelper.requireNonNull(unit, "unit is null"); ObjectHelper.requireNonNull(scheduler, "scheduler is null"); return RxJavaPlugins.onAssembly(new ObservableInterval(Math.max(0L, initialDelay), Math.max(0L, period), unit, scheduler)); }
interval()有很多重载 , 最终调用上面这个方法 . 返回的是ObservableInterval对象 , 默认传过去的Schedulars.computation线程 ,
@Override public void subscribeActual(Observer<? super Long> s) { IntervalObserver is = new IntervalObserver(s); s.onSubscribe(is); Disposable d = scheduler.schedulePeriodicallyDirect(is, initialDelay, period, unit); is.setResource(d); }
订阅之后会调用 , scheduler的计时器方法 .
@Override public void run() { if (get() != DisposableHelper.DISPOSED) { actual.onNext(count++); } }
会按照时间 , 去调用这个方法 .
range():
Observable.range(1 , 4) .subscribe(new Consumer<Integer>() { @Override public void accept(@NonNull Integer integer) throws Exception { Log.i("TAG", "accept: " + integer); } });
输出:
accept: 1
accept: 2
accept: 3
accept: 4
分析:
@CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) public static Observable<Integer> range(final int start, final int count) { if (count < 0) { throw new IllegalArgumentException("count >= 0 required but it was " + count); } if (count == 0) { return empty(); } if (count == 1) { return just(start); } if ((long)start + (count - 1) > Integer.MAX_VALUE) { throw new IllegalArgumentException("Integer overflow"); } return RxJavaPlugins.onAssembly(new ObservableRange(start, count)); }
数量为0 , 返回空的被观察者 , 等于1 , 返回just() , 当大于1时 , 返回ObservableRange()对象 .
@Override protected void subscribeActual(Observer<? super Integer> o) { RangeDisposable parent = new RangeDisposable(o, start, end); o.onSubscribe(parent); parent.run(); }
订阅之后调用RangeDisposable 的run()方法 .
void run() { if (fused) { return; } Observer<? super Integer> actual = this.actual; //index为start , end是 start+count long e = end; for (long i = index; i != e && get() == 0; i++) { actual.onNext((int)i); } if (get() == 0) { lazySet(1); actual.onComplete(); } }
这里也是利用 for 循环来调用onNext()方法 .
repeat():
RxJava将这个操作符实现为repeat方法。它不是创建一个Observable,而是重复发射原始Observable的数据序列,这个序列或者是无限的,或者通过repeat(n)指定重复次数。
Observable.just("111","222" , "333").repeat(2) .subscribe(new Consumer<String>() { @Override public void accept(@NonNull String s) throws Exception { Log.i("TAG", "accept: " + s); } });
输出:
accept: 111
accept: 222
accept: 333
accept: 111
accept: 222
accept: 333
分析:
public final Observable<T> repeat(long times) { if (times < 0) { throw new IllegalArgumentException("times >= 0 required but it was " + times); } if (times == 0) { return empty(); } return RxJavaPlugins.onAssembly(new ObservableRepeat<T>(this, times)); }
这里要了解new ObservableRepeat<T>(this, times)
中的 this , 实际指的是他的第一个上游 , 也就是Observable.just()返回过来的被观察者 .
public ObservableRepeat(Observable<T> source, long count) { super(source); this.count = count; }
这里调用父类构造方法 , 就是把上面传过来的this 存到了ObservableRepeat对象当中 .
@Override public void subscribeActual(Observer<? super T> s) { SequentialDisposable sd = new SequentialDisposable(); s.onSubscribe(sd); RepeatObserver<T> rs = new RepeatObserver<T>(s, count != Long.MAX_VALUE ? count - 1 : Long.MAX_VALUE, sd, source); rs.subscribeNext(); }
当订阅之后调用 RepeatObserver的 subscribeNext() 方法 .
void subscribeNext() { if (getAndIncrement() == 0) { int missed = 1; for (;;) { if (sd.isDisposed()) { return; } //① source.subscribe(this); missed = addAndGet(-missed); if (missed == 0) { break; } } } }
在①处的source就是第一个上游 , Observable.just()对象(简称just对象) , 调用了它的subscribe()方法 , 并且传过去this , 表明 该类订阅了just对象 . 当just对象 , 完成所有任务后 , 他会调用订阅者的(该类)的onComplete()方法 .
@Override public void onComplete() { //① long r = remaining; if (r != Long.MAX_VALUE) { remaining = r - 1; } //② if (r != 0L) { subscribeNext(); } else { actual.onComplete(); } }
① : remaining 是 repeat()传过来的次数 . 每次执行onComplete时 , 将remaining减一 .
② : 当 r 不等于0时 接着调用subscribeNext()方法 , 等于 0 时在调用onComplete()方法 .
startWith():
Observable.just("111" , "222" , "333" , "444") .startWith("321") .subscribe(new Consumer<String>() { @Override public void accept(@NonNull String s) throws Exception { Log.i("TAG", "accept: " + s); } });
输出:
accept: 321
accept: 111
accept: 222
accept: 333
accept: 444
分析:
public final Observable<T> startWith(T item) { ObjectHelper.requireNonNull(item, "item is null"); return concatArray(just(item), this); }
this 指的是ObservableFromArray对象 , 调用了concatArray() 方法 , 将 ObservableFromArray 对象和 ObservableJust 对象传过去 . 从方法名上看 , 是将两个Array结合 .
public static <T> Observable<T> concatArray(ObservableSource<? extends T>... sources) { if (sources.length == 0) { return empty(); } else if (sources.length == 1) { return wrap((ObservableSource<T>)sources[0]); } return RxJavaPlugins.onAssembly(new ObservableConcatMap(fromArray(sources), Functions.identity(), bufferSize(), ErrorMode.BOUNDARY)); }
返回一个ObservableConcatMap对象
public final class ObservableConcatMap<T, U> extends AbstractObservableWithUpstream<T, U> { public ObservableConcatMap(ObservableSource<T> source, Function<? super T, ? extends ObservableSource<? extends U>> mapper, int bufferSize, ErrorMode delayErrors) { super(source); this.mapper = mapper; this.delayErrors = delayErrors; this.bufferSize = Math.max(8, bufferSize); }}
执行订阅方法();
@Override public void subscribeActual(Observer<? super U> s) { if (ObservableScalarXMap.tryScalarXMapSubscribe(source, s, mapper)) { return; } if (delayErrors == ErrorMode.IMMEDIATE) { SerializedObserver<U> serial = new SerializedObserver<U>(s); source.subscribe(new SourceObserver<T, U>(serial, mapper, bufferSize)); } else { source.subscribe(new ConcatMapDelayErrorObserver<T, U>(s, mapper, bufferSize, delayErrors == ErrorMode.END)); } }
source.subscribe(new ConcatMapDelayErrorObserver<T, U>(s, mapper, bufferSize, delayErrors == ErrorMode.END));
这里走第二个分支 , source实际为ObservableFromArray
对象 , 首先调用它的onSubscribe()方法 .
@Override public void onSubscribe(Disposable s) { if (DisposableHelper.validate(this.s, s)) { this.s = s; //① if (s instanceof QueueDisposable) { @SuppressWarnings("unchecked") QueueDisposable<T> qd = (QueueDisposable<T>) s; //② int m = qd.requestFusion(QueueDisposable.ANY); if (m == QueueDisposable.SYNC) { fusionMode = m; queue = qd; done = true; actual.onSubscribe(this); //③ drain(); return; } if (m == QueueDisposable.ASYNC) { fusionMode = m; queue = qd; actual.onSubscribe(this); return; } } queue = new SpscLinkedArrayQueue<T>(bufferSize); actual.onSubscribe(this); } }
① : s 实际为 FromArrayDisposable
继承与 QueueDisposable
.
② : 接着调用它的 requestFusion() 合成模式为ANY , 具体看下面
③ : drain() 方法为核心 , 这里遍历了所有元素
@Override public int requestFusion(int mode) { if ((mode & SYNC) != 0) { fusionMode = true; return SYNC; } return NONE; }
上面是FromArrayDisposable的requestFusion()方法 , 返回SYNC . 并且在 fusionMode 置为true .
@Override public void subscribeActual(Observer<? super T> s) { FromArrayDisposable<T> d = new FromArrayDisposable<T>(s, array); s.onSubscribe(d); //① if (d.fusionMode) { return; } d.run(); }
① : 因为他是合成的 , 所以直接return , 不走run() 方法 , 所以可以知道合成之后 , 并不是在这里执行onNext()等方法 .
void drain() { if (getAndIncrement() != 0) { return; } Observer<? super R> actual = this.actual; SimpleQueue<T> queue = this.queue; AtomicThrowable error = this.error; for (;;) { if (!active) { if (cancelled) { queue.clear(); return; } if (!tillTheEnd) { Throwable ex = error.get(); if (ex != null) { queue.clear(); actual.onError(error.terminate()); return; } } boolean d = done; T v; try { //① v = queue.poll(); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); this.d.dispose(); error.addThrowable(ex); actual.onError(error.terminate()); return; } boolean empty = v == null; //② if (d && empty) { Throwable ex = error.terminate(); if (ex != null) { actual.onError(ex); } else { actual.onComplete(); } return; } if (!empty) { ObservableSource<? extends R> o; try { //③ o = ObjectHelper.requireNonNull(mapper.apply(v), "The mapper returned a null ObservableSource"); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); this.d.dispose(); queue.clear(); error.addThrowable(ex); actual.onError(error.terminate()); return; } if (o instanceof Callable) { R w; try { w = ((Callable<R>)o).call(); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); error.addThrowable(ex); continue; } if (w != null && !cancelled) { //④ actual.onNext(w); } continue; } else { active = true; //⑤ o.subscribe(observer); } } } if (decrementAndGet() == 0) { break; } } }
① : 从队列中拉取一个元素 , FromArrayDisposable
调用的是这个对象的方法()
② : 判断从队列中拉取的对象是否为空 , 如果为空则执行onComplete()方法 .
③ : 转换类型 , 这个例子中返回的是当前数据
④ , ⑤ : 调用拉取元素的onNext() , 或者 订阅 () , 方法 .
这里之所以上一层是 ObservableFromArray
对象 , 是因为他操作了在创建 ObservableConcatMap
对象之前 , 调用fromArray() 方法 , 将just()对象以及()fromArray()对象融合在一起 .
变换操作符
map():
public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) { ObjectHelper.requireNonNull(mapper, "mapper is null"); return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper)); }
用上游的被观察者 , 以及mapper(变换规则) , 创建ObservableMap对象 .
public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) { super(source); this.function = function; }
@Override public void subscribeActual(Observer<? super U> t) { source.subscribe(new MapObserver<T, U>(t, function)); }
map的订阅方法就一行 , 用MapObserver对象订阅了上游的被观察者 .
@Override public void onNext(T t) { if (done) { return; } if (sourceMode != NONE) { actual.onNext(null); return; } U v; try { //① v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value."); } catch (Throwable ex) { fail(ex); return; } actual.onNext(v); }
这里利用mapper , 将 t 转变成 v , 并调用下游订阅者的onNext()方法 .
buffer():
Observable.just("111" , "222" , "333" , "444") .buffer(3) .subscribe(new Consumer<List<String>>() { @Override public void accept(@NonNull List<String> strings) throws Exception { Log.i("TAG", "accept: " + strings); } });
输出:
accept: [111, 222, 333]
accept: [444]
分析:
public final <U extends Collection<? super T>> Observable<U> buffer(int count, int skip, Callable<U> bufferSupplier) { ObjectHelper.verifyPositive(count, "count"); ObjectHelper.verifyPositive(skip, "skip"); ObjectHelper.requireNonNull(bufferSupplier, "bufferSupplier is null"); return RxJavaPlugins.onAssembly(new ObservableBuffer<T, U>(this, count, skip, bufferSupplier)); }
buffer() 简单的buffer , 调用这个方法 , 当调用一个参数的方法时 , skip = count . bufferSupplier 提供缓冲区功能 , 默认每次创建缓冲区都提供new ArrayList();
public ObservableBuffer(ObservableSource<T> source, int count, int skip, Callable<U> bufferSupplier) { super(source); this.count = count; this.skip = skip; this.bufferSupplier = bufferSupplier; }
创建一个ObservableBuffer对象 . 当订阅之后 .
@Override protected void subscribeActual(Observer<? super U> t) { if (skip == count) { //① BufferExactObserver<T, U> bes = new BufferExactObserver<T, U>(t, count, bufferSupplier); //② if (bes.createBuffer()) { source.subscribe(bes); } } else { source.subscribe(new BufferSkipObserver<T, U>(t, count, skip, bufferSupplier)); } }
先分析 skip 和 count相等的情况
① : 创建一个BufferExactObserver , 带有缓冲区的观察者 .
② : 利用 bufferSupplier. call() 创建一个 List 实际为 ArrayList . 给buffer赋值
boolean createBuffer() { U b; try { b = ObjectHelper.requireNonNull(bufferSupplier.call(), "Empty buffer supplied"); } catch (Throwable t) { Exceptions.throwIfFatal(t); buffer = null; if (s == null) { EmptyDisposable.error(t, actual); } else { s.dispose(); actual.onError(t); } return false; } buffer = b; return true; }
创建完缓冲区之后 , 订阅了上游的被观察者 .
@Override public void onNext(T t) { U b = buffer; if (b != null) { b.add(t); if (++size >= count) { actual.onNext(b); size = 0; createBuffer(); } } }
每次上游的订阅者调用当前的onNext()方法 , 会将元素装进缓冲区 , 并且判断当 ++size >= count 时 , 调用下游的onNext()方法 , 将缓冲后的数据传输过去 . 并且将size置为0 , 接着创建缓冲区 , 循环直到结束 . .
当 count > skip
Observable.just("111" , "222" , "333" , "444") .buffer(3 , 2) .subscribe(new Consumer<List<String>>() { @Override public void accept(@NonNull List<String> strings) throws Exception { Log.i("TAG", "accept: " + strings); } });
输出 :
accept: [111, 222, 333]
accept: [333, 444]
当 count < skip
Observable.just("111" , "222" , "333" , "444") .buffer(2 , 3) .subscribe(new Consumer<List<String>>() { @Override public void accept(@NonNull List<String> strings) throws Exception { Log.i("TAG", "accept: " + strings); } });
输出 :
accept: [111, 222]
accept: [444]
@Override protected void subscribeActual(Observer<? super U> t) { if (skip == count) { BufferExactObserver<T, U> bes = new BufferExactObserver<T, U>(t, count, bufferSupplier); if (bes.createBuffer()) { source.subscribe(bes); } } else { //① source.subscribe(new BufferSkipObserver<T, U>(t, count, skip, bufferSupplier)); } }
① : 这回看一下当 skip 和 count 不同时的情况 .
BufferSkipObserver观察者订阅了上游的被观察者 .
@Override public void onNext(T t) { //① if (index++ % skip == 0) { U b; try { //② b = ObjectHelper.requireNonNull(bufferSupplier.call(), "The bufferSupplier returned a null collection. Null values are generally not allowed in 2.x operators and sources."); } catch (Throwable e) { buffers.clear(); s.dispose(); actual.onError(e); return; } //③ buffers.offer(b); } //④ Iterator<U> it = buffers.iterator(); while (it.hasNext()) { U b = it.next(); b.add(t); //⑤ if (count <= b.size()) { it.remove(); //⑥ actual.onNext(b); } } }
① : index默认为0 , 持续++操作 . 每当过了 skip 的数量后 ,
② : 利用bufferSupplier.call()方法 , new ArrayList() .
③ : buffers是一个ArrayDequeue类型 , 把全新的List插入进buffers当中 .
④ : 遍历buffers , 给每个List添加元素 .
⑤ : 当count <= List的size时 , 将该List移除 ,
⑥ : 调用下游观察者的onNext()方法 , 传入缓存好的list
得出结论 : skip 决定 创建buffer(这里是ArrayList)的时机 , count 决定 下游观察者获取的List大小
scan():
Observable.just("111" , "222" , "333" , "444") .scan(new BiFunction<String, String, String>() { @Override public String apply(@NonNull String s, @NonNull String s2) throws Exception { return s + s2; } }).subscribe(new Consumer<String>() { @Override public void accept(@NonNull String s) throws Exception { Log.i("TAG", "accept: " + s); } });
输出:
I: accept: 111
I: accept: 111222
I: accept: 111222333
I: accept: 111222333444
其实和map() 差不多 , 不分析啦
过滤操作
debounce():
仅在过了一段指定的时间还没发射数据时才发射一个数据 .
这里会根据 rxbinding 结合解析 .
Observable.just("111" , "222" , "333") .debounce(2000 , TimeUnit.MILLISECONDS , Schedulers.io()) .subscribe(new Consumer<String>() { @Override public void accept(@NonNull String s) throws Exception { Log.i("TAG", "accept: " + s); Log.i("TAG", "accept: " + Thread.currentThread().getName()); } });
输出:
I: accept: 333
I: accept: main
这个是立即输出的 , 并且是输出在主线程 . 这和我们一般用的RxViews 不大一样 .
分析:
@CheckReturnValue @SchedulerSupport(SchedulerSupport.COMPUTATION) public final Observable<T> debounce(long timeout, TimeUnit unit) { //① return debounce(timeout, unit, Schedulers.computation()); }
这里调用三个参数的debounce()方法 , 并且传入的是Schedulers.computation() .
@CheckReturnValue @SchedulerSupport(SchedulerSupport.CUSTOM) public final Observable<T> debounce(long timeout, TimeUnit unit, Scheduler scheduler) { ObjectHelper.requireNonNull(unit, "unit is null"); ObjectHelper.requireNonNull(scheduler, "scheduler is null"); return RxJavaPlugins.onAssembly(new ObservableDebounceTimed<T>(this, timeout, unit, scheduler)); }
返回的是ObservableDebounceTimed对象
@Override public void subscribeActual(Observer<? super T> t) { source.subscribe(new DebounceTimedObserver<T>( new SerializedObserver<T>(t), timeout, unit, scheduler.createWorker())); }
new了DebounceTimedObserver观察者订阅了上游被观察者(ObservableFromArray) . 订阅之后上游观察者调用DebounceTimedObserver的onNext() .
@Override public void onNext(T t) { if (done) { return; } long idx = index + 1; index = idx; //① Disposable d = timer.get(); if (d != null) { //② d.dispose(); } //③ DebounceEmitter<T> de = new DebounceEmitter<T>(t, idx, this); //④ if (timer.compareAndSet(d, de)) { //⑤ d = worker.schedule(de, timeout, unit); de.setResource(d); } }
首先要明确该例子上游的被观察者是ObservableFromArray
对象 , 它会遍历调用onNext后 , 最后调用onComplete方法 .
① : timer 是 AtomicReference<Disposable>类型 .
② : 如果 d 不为空 , 调用dispose()方法
③ : DebounceEmitter实际作用可以看做是Runnable 对象 , 在该对象中继续调用下游观察者的onNext()等方法
④ : 给timer赋值 , 也就是每次onNext都会将原来的 runnable对象给dispose()掉 .
⑤ : 利用线程池执行延时操作 , 该例子是延时2秒执行 DebounceEmitter
.
在看一下DebounceEmitter
的run()方法
@Override public void run() { //① if (once.compareAndSet(false, true)) { //② parent.emit(idx, value, this); } }
① : 重点 once 是 AtomicBoolean类型的成员变量 , 有哪个数据流已经调用过run() 方法了 , 那么不会调用emit() 方法 .
② : parent 实际为 DebounceTimedObserver
对象
void emit(long idx, T t, DebounceEmitter<T> emitter) { if (idx == index) { //② actual.onNext(t); emitter.dispose(); } }
① : 利用idx 防止多次执行 下游的onNext()方法 .
到这里可能还有疑惑 , 接着看一下onComplete()方法 .
@Override public void onComplete() { if (done) { return; } done = true; //① Disposable d = timer.get(); if (d != DisposableHelper.DISPOSED) { @SuppressWarnings("unchecked") DebounceEmitter<T> de = (DebounceEmitter<T>)d; if (de != null) { //② de.run(); } actual.onComplete(); //③ worker.dispose(); } }
① : 从timer 中获取最新的Disposable .
② : 这里调用了 run()方法 , 并且这是在主线程 .
③ : dispose掉线程 .
他迅速执行完onNext() , 并且执行了onComplete()方法 , 所以他并不会延迟2秒后给我发消息 , 而且是主线程 . 接下来看看rxbinding是如何实现延迟给发送消息的 .
RxView.clicks(findViewById(R.id.create)).debounce(2000 , TimeUnit.MILLISECONDS) .subscribe(new Consumer<Object>() { @Override public void accept(@NonNull Object o) throws Exception { Log.i("TAG", "accept: " + Thread.currentThread().getName()); } });
输出 : I: accept: RxComputationThreadPool-1(两秒后)
分析 :
@Override protected void subscribeActual(Observer<? super Object> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); observer.onSubscribe(listener); view.setOnClickListener(listener); }
Listener 中的onClick()方法 .
@Override public void onClick(View v) { if (!isDisposed()) { //① observer.onNext(Notification.INSTANCE); } }
① : observer是下游的观察者 , 也就是DebounceTimedObserver
对象 , 这里只调用了onNext() , 没有调用onComplete()方法 , 所以他并不会在主线程执行 上面分析的 run()方法 , 而是在子线程延时发送事件 .
distinct():
这个比较简单 , 内部用HashSet()去重 , 也可以根据自定义key来去重 .
skip():
public final Observable<T> skip(long count) { if (count <= 0) { return RxJavaPlugins.onAssembly(this); } return RxJavaPlugins.onAssembly(new ObservableSkip<T>(this, count)); }
返回一个ObservableSkip
对象 ,
@Override public void subscribeActual(Observer<? super T> s) { source.subscribe(new SkipObserver<T>(s, n)); }
SkipObserver订阅了上游的被观察者 .
@Override public void onNext(T t) { //① if (remaining != 0L) { remaining--; } else { actual.onNext(t); } }
①remaining是我们传的skip()参数 , 他这里会调用 – , 并且来跳过元素 . 当remaining == 0 时执行下游观察者的onNext()方法 .
skipLast():
public final Observable<T> skipLast(int count) { if (count < 0) { throw new IndexOutOfBoundsException("count >= 0 required but it was " + count); } if (count == 0) { return RxJavaPlugins.onAssembly(this); } return RxJavaPlugins.onAssembly(new ObservableSkipLast<T>(this, count)); }
返回ObservableSkipLast
对象 .
@Override public void subscribeActual(Observer<? super T> s) { source.subscribe(new SkipLastObserver<T>(s, skip)); }
SkipLastObserver订阅了上游的被观察者 .
@Override public void onNext(T t) { //① if (skip == size()) { //② actual.onNext(poll()); } //③ offer(t); }
① : SkipLastObserver继承了ArrayDeque , 是一个队列 , skip()为传过来的参数 .
② : 从队列中抽出第一个元素调用下游观察者的onNext()方法 , 每次抽出元素后size()会 -1
③ : 每次都会给队列插入元素 , 插入后size()+1 .
skip() 和 skipLast() 为相对的作用 , 但处理时skipLast()是用队列来处理 .
reduce():
@CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) public final Maybe<T> reduce(BiFunction<T, T, T> reducer) { ObjectHelper.requireNonNull(reducer, "reducer is null"); return RxJavaPlugins.onAssembly(new ObservableReduceMaybe<T>(this, reducer)); }
@Override protected void subscribeActual(MaybeObserver<? super T> observer) { source.subscribe(new ReduceObserver<T>(observer, reducer)); }
套路都一样..
@Override public void onNext(T value) { if (!done) { T v = this.value; //① if (v == null) { this.value = value; } else { try { //② this.value = ObjectHelper.requireNonNull(reducer.apply(v, value), "The reducer returned a null value"); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); d.dispose(); onError(ex); } } } }
① : 判断 this.value 是否为空 , 第一次onNext()肯定是空的 , 所以第一次不走reducer .
② : 从第二次onNext()开始会调用 , 自己实现的reducer() , 并给 this.value 赋值 , 下次的reducer的参数就是这一次的 reducer返回的值 , 就一直这样直到onComplete()
@Override public void onComplete() { if (done) { return; } done = true; T v = value; value = null; //① if (v != null) { actual.onSuccess(v); } else { actual.onComplete(); } }
① : 在onComplete() 时调用 , 咱们的观察者 , 这里onSuccess和是Rxjava2中新添的观察者 MaybeObserver
, 具体可以看下更新 .
这里scan()和reduce()比较类似 , 但是还是有不一样的地方 , 数据处理的地方 , 还有reduce成功后只掉一次观察者的方法 , scan是每次都调用 .
@Override public void onComplete() { if (done) { return; } done = true; T v = value; value = null; if (v != null) { actual.onSuccess(v); } else { actual.onComplete(); } }
结合操作
merge():
concat():
两个都是合并数据源的操作 , concat保证顺序 , merge不保证顺序 .
zip():
combineLatest():
两个都是将被观察者合并 , zip是逐个合并 , combineLatest()是最后一个元素依次合并(不知道这个说法对不对 , 大家可以去多尝试)
先码到这里 , 待续…
- Rxjava操作符源码分析
- [RxJava学习]操作符Map源码分析
- [RxJava学习]操作符flatMap源码分析
- RxJava进阶之源码分析map() 操作符分析
- RxJava(一) create操作符的用法和源码分析
- RxJava源码初步分析
- RxJava源码分析
- RxJava源码分析
- rxJava 源码 原理分析
- RxJava的源码分析
- Rxjava源码分析
- RxJava源码分析(一)
- RxJava源码分析(二)
- [RxJava学习]subscribeOn源码分析
- [RxJava学习]observeOn源码分析
- RxJava 源码解读分析 Scheduler
- RxJava 源码解读分析 observeOn
- RxJava 源码解读分析 from
- Tomcat6.0源码学习-构建Eclipse源码工程
- 欢迎使用CSDN-markdown编辑器
- sublime解决乱码问题
- Java基础第8讲--面向对象之封装
- 微信小程序发送POST请求参数格式
- Rxjava操作符源码分析
- 动态规划复习
- centos yum安装mysql
- [Unity&JSON]LitJSON 读取数组文件,多个数据,玩家得分表数据
- linux快捷键
- Linux多网卡绑定实践
- 拉格朗日乘子法的分析基础篇
- Java Web项目中使用Freemarker生成Word文档
- android 动画android:pivotX,Y的解析