RxJava2ソースコード分析ノート(3)スレッドの切り替え
最も単純な呼び出しを見てみましょう
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Object> emitter) throws Exception {
System.out.println(" 被观察者 subscribe ");
emitter.onNext("onNext");
// onError 和 onComple 其中一个被调用就代表结束
// 另一个不会被调用,下面源码中会分析
emitter.onError(new NullPointerException());
emitter.onComplete();
}
}).subscribe(new Observer<Object>() {
@Override
public void onComplete() {
System.out.println(" onComplete ");
}
@Override
public void onError(@NonNull Throwable e) {
System.out.println(" onError " + e);
}
@Override
public void onNext(@NonNull Object object) {
System.out.println(" onNext ");
}
@Override
public void onSubscribe(@NonNull Disposable d) {
// 此方法是第一个被回调的,在其他回调方法之前
System.out.println(" 观察者onSubscribe ");
}
});
ログの印刷(ログでonErrorが実行された後、onCompleteがログを出力しないことがわかります)
上記は単にオブザーバーを作成し、コールバックを受信するためにサブスクライバーを登録することです。
Observable.create(ビューア).subscribe(ビューア);
1 Observable.createを最初に見てください(observed)
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
ObjectHelper.requireNonNull(source, "source is null");
//省略其他代码,只留主要代码
return new ObservableCreate<T>(source);
}
↓
↓
↓ ObservableCreateを見
↓
↓
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);
}
}
//...后面先省略
//...
Observable.createはここにあり、Observableを継承するObservableCreateオブジェクトを取得します。Observableの抽象メソッドsubscribeActualが実装されています。
2もう一度見てください。subscribe(observer);
@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, "Plugin returned null Observer");
//观察者对象被subscribe进来以后执行了这个方法
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(observer);が見つかりましたをクリックします。
protected abstract void subscribeActual(Observer<? super T> observer);
特定の実装がObservable.create(observable);に実装されているため、これが抽象メソッドである理由は、上記のObservable.create (observed)によって取得されたObservableCreateオブジェクトに戻り、subscribeActualメソッドがどのように実装されているかを確認します。
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) {
// 1 subscribe方法传进的观察者被传到了这里
// 2 Emitter是发射,发射器的意思,就是发射数据用的;并将subscribe方法传进的观察者
// 传到这个发射器里面
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
// 3 此处就是执行subscribe方法中观察者的onSubscribe方法,所以会先打印这个日志
observer.onSubscribe(parent);
try {
// 4 这个source就是create的时候传进的被观察者,执行subscribe方法
source.subscribe(parent);
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
parent.onError(ex);
}
}
上の図では、4 source.subscribe(parent);が実際に実行されます。
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Object> emitter) throws
Exception {
System.out.println(" 被观察者 subscribe ");
emitter.onNext("onNext");
// onError 和 onComple 其中一个被调用就代表结束
// 另一个不会被调用,下面源码中会分析
emitter.onError(new NullPointerException());
emitter.onComplete();
}
}
而emitter接着就会执行 onNext....及后面的方法。emitter其实就是上上图中2
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
クリックしてご覧ください
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);
}
}
//CreateEmitter 是ObservableCreate中的一个内部类
static final class CreateEmitter<T>
extends AtomicReference<Disposable>
implements ObservableEmitter<T>, Disposable {
private static final long serialVersionUID = -3434801548987643227L;
final Observer<? super T> observer;
//接收到subscribe传进来的观察者赋值给全局observer
//后面就是使用它调用onNext,onError,onComplete方法
CreateEmitter(Observer<? super T> observer) {
this.observer = observer;
}
@Override
public void onNext(T t) {
if (!isDisposed()) {
//这里执行其实就是调用subscribe绑定的观察者的onNext
observer.onNext(t);
}
}
@Override
public void onError(Throwable t) {
if (!tryOnError(t)) {
RxJavaPlugins.onError(t);
}
}
@Override
public boolean tryOnError(Throwable t) {
if (!isDisposed()) {
try {
//这里执行其实就是调用subscribe绑定的观察者的onError
observer.onError(t);
} finally {
dispose();
}
return true;
}
return false;
}
@Override
public void onComplete() {
if (!isDisposed()) {
try {
//这里执行其实就是调用subscribe绑定的观察者的onComplete
observer.onComplete();
} finally {
dispose();
}
}
}
//其他省略
}
このような完全なコールバックは機能します。
総括する:
加えて:
その中で、onCompleteとonErrorを実行すると、dispose()メソッド内でfinallyが実行され、判断を実行する前にif(!isDisposed())、
一方が実行されると、disposeの状態が変更されるため、もう一方は実行されません。
このように、onCompleteとoneErrorは、どちらか一方のみを実行し、両方は実行しません。
@Override
public void onError(Throwable t) {
if (!tryOnError(t)) {
RxJavaPlugins.onError(t);
}
}
@Override
public boolean tryOnError(Throwable t) {
if (!isDisposed()) {
try {
observer.onError(t);
} finally {
dispose();
}
return true;
}
return false;
}
@Override
public void onComplete() {
if (!isDisposed()) {
try {
observer.onComplete();
} finally {
dispose();
}
}
}