RxJava中Observable类对应方法map和filter的调用分析

125 阅读4分钟

示例代码

示例中引入的RxJava库为RxJava2.0。

public class TempInfo {
    public static final Random RANDOM = new Random();

    private final String town;
    private final int temp;

    public TempInfo(String town, int temp) {
        this.town = town;
        this.temp = temp;
    }
    public static TempInfo fetch(String town){
        /*if(RANDOM.nextInt(10) == 0){
            throw new RuntimeException("Error!");
        }*/
        return new TempInfo(town, RANDOM.nextInt(100));
    }

    @Override
    public String toString() {
        return town + " : " + temp;
    }

    public String getTown() {
        return town;
    }

    public int getTemp() {
        return temp;
    }
}
public class TempObserver implements Observer<TempInfo> {
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(TempInfo tempInfo) {
        System.out.println(tempInfo);
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("Got problem: " + e.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("Done!");
    }
}
public static void main(String[] args) {        
    getNegativeTemperature("New York").blockingSubscribe(new TempObserver());
}
    public static Observable<TempInfo> getTemperature(String town){
        //create传参ObservableOnSubscribe,为一函数式接口,只有一个subscribe方法,传参ObservableEmitter
        return Observable.create(emitter -> Observable.interval(1, TimeUnit.SECONDS).subscribe(i -> {
            if(!emitter.isDisposed()){
                if(i >= 5){
                    emitter.onComplete();
                } else {
                    try {
                        emitter.onNext(TempInfo.fetch(town));
                    } catch (Exception e) {
                        emitter.onError(e);
                    }
                }
            }
        }));        
    }

    public static Observable<TempInfo> getCelsiusTemperature(String town){
        return getTemperature(town).map(tempInfo -> new TempInfo(tempInfo.getTown(), (tempInfo.getTemp() - 32) * 5 / 9));
    }
    public static Observable<TempInfo> getNegativeTemperature(String town){
        return getCelsiusTemperature(town).filter(tempInfo -> tempInfo.getTemp() < 0);
    }

示例意思为:创建一个每秒一次返回温度的Observable对象,且将温度转换为摄氏温度,并且只有在摄氏温度低于0℃时才返回。

调用流程分析

入口是Observable.create方法,参数为一个等待传入emitter的lambda表达式,针对返回的ObservableCreate,执行map和filter操作。

//1.Observable.create方法,source为lambda表达式
	@CheckReturnValue
    @NonNull
    @SchedulerSupport(SchedulerSupport.NONE)
    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
        ObjectHelper.requireNonNull(source, "source is null");
        return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
    }
//2.map操作,方法存在于Observable类中
	@CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    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));
    }
//3.filter操作,方法存在于Observable类中
	@CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public final Observable<T> filter(Predicate<? super T> predicate) {
        ObjectHelper.requireNonNull(predicate, "predicate is null");
        return RxJavaPlugins.onAssembly(new ObservableFilter<T>(this, predicate));
    }

上面的操作执行完,返回的Observable为ObservableFilter,接着在其上执行blockingSubscribe方法,传入TempInfo。

//4.blockingSubscribe,方法存在于ObservableFilter的父类Observable中
	@SchedulerSupport(SchedulerSupport.NONE)
    public final void blockingSubscribe(Observer<? super T> observer) {
        ObservableBlockingSubscribe.subscribe(this, observer);
    }

进入方法内部分析。

//4.1 ObservableBlockingSubscribe
		public static <T> void subscribe(ObservableSource<? extends T> o, Observer<? super T> observer) {
			final BlockingQueue<Object> queue = new LinkedBlockingQueue<Object>();

			BlockingObserver<T> bs = new BlockingObserver<T>(queue);
			observer.onSubscribe(bs);

			//4.1.1 构造订阅链
			o.subscribe(bs);//转换为bs对o的订阅,o为ObservableFilter
			//4.1.2 出队操作
			for (;;) {
				if (bs.isDisposed()) {
					break;
				}
				Object v = queue.poll();
				if (v == null) {
					try {
						v = queue.take();
					} catch (InterruptedException ex) {
						bs.dispose();
						observer.onError(ex);
						return;
					}
				}
				//4.1.2.1 打印输出
				if (bs.isDisposed()
						|| v == BlockingObserver.TERMINATED
						|| NotificationLite.acceptFull(v, observer)) {
					break;
				}
			}
		}
//4.1.1 方法存在于Observable
		@SchedulerSupport(SchedulerSupport.NONE)
		@Override
		public final void subscribe(Observer<? super T> observer) {
			ObjectHelper.requireNonNull(observer, "observer is null");
			try {
				observer = RxJavaPlugins.onSubscribe(this, observer);

				ObjectHelper.requireNonNull(observer, "The RxJavaPlugins.onSubscribe hook returned a null Observer. Please change the handler provided to RxJavaPlugins.setOnObservableSubscribe for invalid null returns. Further reading: https://github.com/ReactiveX/RxJava/wiki/Plugins");

				subscribeActual(observer);
			} catch (NullPointerException e) { // NOPMD
				throw e;
			} catch (Throwable e) {
				Exceptions.throwIfFatal(e);
				// can't call onError because no way to know if a Disposable has been set or not
				// can't call onSubscribe because the call might have set a Subscription already
				RxJavaPlugins.onError(e);

				NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
				npe.initCause(e);
				throw npe;
			}
		}

其中subscribeActual为一抽象方法,由具体子类实现,此处先是执行到ObservableFilter中。

//4.1.1.1 ObservableFilter
		@Override
		public void subscribeActual(Observer<? super T> observer) {
			source.subscribe(new FilterObserver<T>(observer, predicate));
		}

source为构造ObservableFilter时传入的ObservableMap,此处将传参BlockingObserver和构造ObservableFilter时传入的prediacate封装为一个FilterObserver,接着订阅ObservableMap。

接着又执行到4.1.1,不过此时的方法调用者变成了ObservableMap,再次执行到抽象方法subscribeActual中。

//4.1.1.2 ObservableMap
		@Override
		public void subscribeActual(Observer<? super U> t) {
			source.subscribe(new MapObserver<T, U>(t, function));
		}

此处source为构造ObservableMap时传入的ObservableCreate,接着将FilterObserver和function封装为MapObserver,去订阅ObservableMap。

再次执行到4.1.1,此时方法调用者变成了ObservableCreate,再次执行到抽象方法subscribeActual中。

//4.1.1.3 ObservableCreate
		@Override
		protected void subscribeActual(Observer<? super T> observer) {
			CreateEmitter<T> parent = new CreateEmitter<T>(observer);
			observer.onSubscribe(parent);

			try {
				source.subscribe(parent);
			} catch (Throwable ex) {
				Exceptions.throwIfFatal(ex);
				parent.onError(ex);
			}
		}

通过MapObserver构造一个CreateEmitter,作为参数,再次执行subscribe方法。不过这个subscribe方法存在于函数接口ObservableOnSubscribe中,接收一个ObservableEmitter参数,所以此处的执行其实是执行到了Observable.create中定义的lambda表达式。

接着执行自定义的内部订阅emitter.onNext。

//5.订阅链处理
		//5.1 CreateEmitter
		@Override
        public void onNext(T t) {
            if (t == null) {
                onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
                return;
            }
            if (!isDisposed()) {
                observer.onNext(t);
            }
        }

observer为4.1.1.3时构造CreateEmitter传入的MapObserver。

//5.2 MapObserver
		@Override
        public void onNext(T t) {
            if (done) {
                return;
            }

            if (sourceMode != NONE) {
                downstream.onNext(null);
                return;
            }

            U v;

            try {
				//处理mapper映射
                v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
            } catch (Throwable ex) {
                fail(ex);
                return;
            }
            downstream.onNext(v);
        }

downstream为4.1.1.1时构造的FilterObserver。

//5.3 FilterObserver
		@Override
        public void onNext(T t) {
            if (sourceMode == NONE) {
                boolean b;
                try {
					//执行filter过滤
                    b = filter.test(t);
                } catch (Throwable e) {
                    fail(e);
                    return;
                }
                if (b) {
                    downstream.onNext(t);
                }
            } else {
                downstream.onNext(null);
            }
        }

downstream为4.1中构造的BlockingObserver。

//5.4 BlockingObserver
		@Override
		public void onNext(T t) {
			queue.offer(NotificationLite.next(t));
		}
		@Override
		public void onComplete() {
			queue.offer(NotificationLite.complete());
		}

即在BlockingObserver中执行入队操作,待入队结束后,返回4.1.2执行出队操作,进而执行到
NotificationLite.acceptFull(v, observer)。

//4.1.2.1 observer为调用blockingSubscribe方法时的传参
		public static <T> boolean acceptFull(Object o, Observer<? super T> observer) {
			if (o == COMPLETE) {
				observer.onComplete();
				return true;
			} else
			if (o instanceof ErrorNotification) {
				observer.onError(((ErrorNotification)o).e);
				return true;
			} else
			if (o instanceof DisposableNotification) {
				observer.onSubscribe(((DisposableNotification)o).upstream);
				return false;
			}
			//执行打印输出
			observer.onNext((T)o);
			return false;
		}

其中,ObservableCreate、ObservableMap、ObservableFilter都是抽象类Observable的子类;FilterObserver、MapObserver都是接口Observer的子类。

总结

ObservableMap持有ObservableCreate,ObservableFilter持有ObservableMap,即在这条Observable链上,下游的Observable始终持有上一个Observable。
ObservableOnSubscribe <-- ObservableCreate <-- ObservableMap <-- ObservableFilter,最后以最末尾的Observable返回,然后在每一个Observable子类的subscribeActual方法中,构造Observer对前一个Observable的订阅
而针对Observer,始终是上一个Observer持有下一个Observer。
CreateEmitter --> MapObserver --> FilterObserver --> BlockingObserver。
可以把Emitter看成是不带onSubscribe方法的Observer。

ObservableFilter的订阅者是BlockingObserver,ObservableMap的订阅者是FilterObserver,ObservableCreate的订阅者是MapObserver,ObservableOnSubscribe中的订阅者是CreateEmitter。

本文转自 blog.csdn.net/zlk25262006…,如有侵权,请联系删除。