Observable可以发送多个事件,也可以发送onError,会调用onComplete
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NotNull ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onComplete();
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(@NotNull Disposable d) {
System.out.println("onSubscribe");
}
@Override
public void onNext(@NotNull Integer integer) {
System.out.println("onNext: " + integer);
}
@Override
public void onError(@NotNull Throwable e) {
System.out.println("onError: " + e.getMessage());
}
@Override
public void onComplete() {
System.out.println("onComplete");
}
});
看看Observable
public abstract class Observable<T> implements ObservableSource<T>
public interface ObservableSource<T> {
void subscribe(@NonNull Observer<? super T> observer);
}
public interface Observer<T> {
void onSubscribe(@NonNull Disposable d);
void onNext(@NonNull T t);
void onError(@NonNull Throwable e);
void onComplete();
}
可以看出被观察者Observable感兴趣的Observer的方法 。
调用create,创造ObservableCreate对象。
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
...
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
public final class ObservableCreate<T> extends Observable<T> {
final ObservableOnSubscribe<T> source;
public ObservableCreate(ObservableOnSubscribe<T> source) {
this.source = source;
}
@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);
}
}
执行到 source.subscribe(parent);,就到了我们的
public void subscribe(@NotNull ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onComplete();
}
CreateEmitter中observer调用onNext方法
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);
}
}
一旦调用onComplete,事件就dispose了。事件流就截止了。
public void onComplete() {
if (!isDisposed()) {
try {
observer.onComplete();
} finally {
dispose();
}
}
}
基于源码2.2.4版本