Just 操作符
当接受的参数为单个元素时:
observable.just("fdf");
被观察者实例 :ObservableJust
subscribeActual 将传入的观察者与ObservableJust的内部类ScalarDisposable事件发射器关联,
public static final class ScalarDisposable<T>
extends AtomicInteger
implements QueueDisposable<T>, Runnable
如上可见ScalarDisposable 本身实现了Runnable,事件发射自然就执行在run方法中
@Override
public void run() {
if (get() == START && compareAndSet(START, ON_NEXT)) {
observer.onNext(value);
if (get() == ON_NEXT) {
lazySet(ON_COMPLETE);
observer.onComplete();
}
}
}
当接受的参数为多个元素时:
首先会调用fromArray确认是否为多个元素
如果为一个元素时,则重复上面的上面的步骤
如果为多个元素时:
observable.just("fdf","xxx")
被观察者实例 :ObservableFromArray
subscribeActual 将传入的观察者与 ObservableFromArray的内部类FromArrayDisposable事件发射器关联
static final class FromArrayDisposable<T> extends BasicQueueDisposable<T>
可以看到FromArrayDisposable继承自BasicQueueDisposable,所以他也是一个队列
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();
}
}
如上源码可见,在run方法中对just传进来的元素进行遍历,然后进行事件发射.
网友评论