public static void subscriber3(){
Observable.just(1,2,3)// #2
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
System.out.println("this is filter value = " + integer);
return integer >1;
}
})
.map(new Func1<Integer, Object>() {
@Override
public Object call(Integer integer) {
System.out.println("this is map value = " + integer);
return integer * 2;
}
})
.lift(new Observable.Operator<Object, Object>() {
@Override
public Subscriber<? super Object> call(Subscriber<? super Object> subscriber) {
System.out.println("this is lift");
return new Subscriber<Object>() {// #1
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) { // #3
System.out.println("this is lift onNext value = " + o);
subscriber.onNext(o);//此处调用 #4
}
};
}
})
.subscribe(item ->{
System.out.println(item);// #4
});
}
在rxJava1.0中中间操作符构造方法,以Map操作符为例:
public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
// this 指上流中间操作符,示例中指Filter相关Observable
return unsafeCreate(new OnSubscribeMap<T, R>(this, func));
}
public OnSubscribeMap(Observable<T> source, Func1 transformer) {
this.source = source;
this.transformer = transformer;
}
public static <T> Observable<T> unsafeCreate(OnSubscribe<T> f) {
return new Observable<T>(RxJavaHooks.onCreate(f));
}
protected Observable(OnSubscribe<T> f) {
this.onSubscribe = f;
}
1、订阅过程
static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
// new Subscriber so onStart it
subscriber.onStart();
if (!(subscriber instanceof SafeSubscriber)) {
subscriber = new SafeSubscriber<T>(subscriber);
}
// observable.onSubscribe 指 OnSubscribeLift
RxJavaHooks.onObservableStart(observable,observable.onSubscribe)
.call(subscriber);
return RxJavaHooks.onObservableReturn(subscriber);
}
1.1、OnSubscribeLift
public void call(Subscriber<? super R> o) {
Subscriber<? super T> st = RxJavaHooks.onObservableLift(operator).call(o);//调用 #1
st.onStart();
parent.call(st);// parent指代 OnSubscribeMap
}
1.2、OnSubscribeMap
public void call(final Subscriber<? super R> o) {
MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
o.add(parent);
// source 指代 OnSubscribeFilter 策略模式:调用抽象类Observable#unsafeSubscribe
source.unsafeSubscribe(parent);
}
public void setProducer(Producer p) {
actual.setProducer(p);//actual:OnSubscribeLift中Subscriber #1
}
存在订阅者Subscriber相关的静态内部类:MapSubscriber。
public void onNext(T t) {
R result = mapper.call(t);
actual.onNext(result);// OnSubscribeLift操作符相关Subscriber的onNext,也即调用 #3
}
1.3、OnSubscribeFilter
public void call(final Subscriber<? super T> child) {
FilterSubscriber<T> parent = new FilterSubscriber<T>(child, predicate);
child.add(parent);
// source 指代 OnSubscribeFromArray
source.unsafeSubscribe(parent);
}
public void setProducer(Producer p) {
super.setProducer(p);
actual.setProducer(p);//actual:OnSubscribeMap
}
存在订阅者Subscriber相关的静态内部类:FilterSubscriber。
public void onNext(T t) {
boolean result = predicate.call(t);
if (result) {
actual.onNext(t);// MapSubscriber#onNext
} else {
request(1);
}
}
1.4、OnSubscribeFromArray
public void call(Subscriber<? super T> child) {
// child:OnSubscribeFilter
child.setProducer(new FromArrayProducer<T>(child, array));
}
public void request(long n) {
if (n == Long.MAX_VALUE) {
if (BackpressureUtils.getAndAddRequest(this, n) == 0) {
fastPath();//背压策略
}
}
}
void fastPath() {
final Subscriber<? super T> child = this.child;
for (T t : array) {//遍历初始化元素
if (child.isUnsubscribed()) {
return;
}
child.onNext(t);
}
if (child.isUnsubscribed()) {
return;
}
child.onCompleted();
}
2、Observable
public final Subscription unsafeSubscribe(Subscriber<? super T> subscriber) {
subscriber.onStart();
// allow the hook to intercept and/or decorate
// onSubscribe:OnSubscribeFilter#call
RxJavaHooks.onObservableStart(this, onSubscribe).call(subscriber);
return RxJavaHooks.onObservableReturn(subscriber);
}
3、Subscriber
public abstract class Subscriber<T> implements Observer<T>, Subscription {
public void setProducer(Producer p) {
long toRequest;
boolean passToSubscriber = false;
...
if (passToSubscriber) {
subscriber.setProducer(producer);
} else {
if (toRequest == NOT_SET) {//类似背压策略 #2数组元素
producer.request(Long.MAX_VALUE);//producer:FromArrayProducer
} else {
producer.request(toRequest);
}
}
}
}
void fastPath() {
final Subscriber<? super T> child = this.child;
for (T t : array) {
if (child.isUnsubscribed()) {
return;
}
// child:FilterSubscriber # onNext
child.onNext(t);
}
if (child.isUnsubscribed()) {
return;
}
child.onCompleted();
}