3-3、Rxjava-创建操作符empty、never、error

924 阅读1分钟

基本创建

// 创建一个什么都不做直接通知完成的 Observable
Observable.empty();
// 创建一个不发射任何数据的 Observable
Observable.never();
// 创建一个什么都不做直接通知错误的 Observable
Observable.error(new Throwable("这条信息报错啦"));

源码分析

Observable中的函数

在Observable抽象类中有如下几个函数:

  1. empty
public static <T> Observable<T> empty() {
    return RxJavaPlugins.onAssembly((Observable<T>) ObservableEmpty.INSTANCE);
}
  1. never
public static <T> Observable<T> never() {
    return RxJavaPlugins.onAssembly((Observable<T>) ObservableNever.INSTANCE);
}
  1. error
public static <T> Observable<T> error(Callable<? extends Throwable> errorSupplier) {
    ObjectHelper.requireNonNull(errorSupplier, "errorSupplier is null");
    return RxJavaPlugins.onAssembly(new ObservableError<T>(errorSupplier));
}

empty的实现类

public final class ObservableEmpty extends Observable<Object> implements ScalarCallable<Object> {
    // 获取的是单例
    public static final Observable<Object> INSTANCE = new ObservableEmpty();

    private ObservableEmpty() {
    }

    @Override
    protected void subscribeActual(Observer<? super Object> o) {
        // 订阅时调用onSubscribe、onComplete
        EmptyDisposable.complete(o);
    }

    @Override
    public Object call() {
        return null; // null scalar is interpreted as being empty
    }
}

never的实现类

** ObservableNever类中 **

public final class ObservableNever extends Observable<Object> {
    // 获取的是单例
    public static final Observable<Object> INSTANCE = new ObservableNever();

    private ObservableNever() {
    }

    @Override
    protected void subscribeActual(Observer<? super Object> o) {
        // 只订阅,传入一个disposable
        o.onSubscribe(EmptyDisposable.NEVER);
    }
}

error的实现类

** ObservableError抽象类中 **

public final class ObservableError<T> extends Observable<T> {
    final Callable<? extends Throwable> errorSupplier;
    public ObservableError(Callable<? extends Throwable> errorSupplier) {
        this.errorSupplier = errorSupplier;
    }
    @Override
    public void subscribeActual(Observer<? super T> s) {
        Throwable error;
        try {
            error = ObjectHelper.requireNonNull(errorSupplier.call(), "Callable returned null throwable. Null values are generally not allowed in 2.x operators and sources.");
        } catch (Throwable t) {
            Exceptions.throwIfFatal(t);
            error = t;
        }
        // 订阅时调用onSubscribe、onError
        EmptyDisposable.error(error, s);
    }
}

Disposable

// 它是一个枚举单例
public enum EmptyDisposable implements QueueDisposable<Object> {
    /**
     * Since EmptyDisposable implements QueueDisposable and is empty,
     * don't use it in tests and then signal onNext with it;
     * use Disposables.empty() instead.
     */
    INSTANCE,
    /**
     * An empty disposable that returns false for isDisposed.
     */
    NEVER
    ;

    <···省略···>

    // 调用complete的地方
    public static void complete(Observer<?> s) {
        s.onSubscribe(INSTANCE);
        s.onComplete();
    }

    <···省略···>

    // 调用error的地方
    public static void error(Throwable e, Observer<?> s) {
        s.onSubscribe(INSTANCE);
        s.onError(e);
    }
    
    <···省略···>

}