基本创建
// 创建一个什么都不做直接通知完成的 Observable
Observable.empty();
// 创建一个不发射任何数据的 Observable
Observable.never();
// 创建一个什么都不做直接通知错误的 Observable
Observable.error(new Throwable("这条信息报错啦"));
源码分析
Observable中的函数
在Observable抽象类中有如下几个函数:
- empty
public static <T> Observable<T> empty() {
return RxJavaPlugins.onAssembly((Observable<T>) ObservableEmpty.INSTANCE);
}
- never
public static <T> Observable<T> never() {
return RxJavaPlugins.onAssembly((Observable<T>) ObservableNever.INSTANCE);
}
- 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);
}
<···省略···>
}