目錄
github代碼地址
1、代碼調用流程圖
從下圖中我們可看到:
1、調用create()方法會new 一個ObservableOnSubscribe對象,並將這個對象傳到了ObservableCreate類中;
2、調用subscribe()訂閱時,我們會創建一個Observer對象,並且穿給CreateEmitter類中;
3、然後,調用subscribe()會最後調用:
ObservableCreate_subscribeActual()
----->ObservableOnSubscribe_subscribe()
----->Emitter_onNext()
----->Observer_onNext()
4、這樣我們Create()方法中的onNext()中的值,就傳到了Observer中onNext()方法中。
1.1、create()
1.2、subscribe()
2、代碼
2.1、結構目錄
2.2、代碼一
YoObservableSource--->YoObservable--->YoObservableCreate
它們三者是繼承關係。
public interface YoObservableSource<T> {
void subscribe(YoObserver<? super T> yoObserver);
}
----------------------------------------------------------------------------
public abstract class YoObservable<T> implements YoObservableSource<T> {
@Override
public void subscribe(YoObserver<? super T> yoObserver) {
subscribeActual(yoObserver);
}
public static YoObservable create(YoObservableOnSubscribe source) {
return new YoObservableCreate(source);
}
protected abstract void subscribeActual(YoObserver<? super T> observer);
}
----------------------------------------------------------------------------
public class YoObservableCreate<T> extends YoObservable<T> {
private final YoObservableOnSubscribe<T> source;
public YoObservableCreate(YoObservableOnSubscribe<T> source) {
this.source = source;
}
@Override
protected void subscribeActual(YoObserver<? super T> observer) {
YoEmitter emitter = new YoCreateEmitter(observer);
source.subscribe(emitter);
}
static final class YoCreateEmitter<T> implements YoEmitter<T> {
final YoObserver<? super T> observer;
YoCreateEmitter(YoObserver<? super T> observer) {
this.observer = observer;
}
@Override
public void onNext(T t) {
if (!isDisposed()) {
observer.onNext(t);
}
}
@Override
public void onError(Throwable t) {
if (!isDisposed()) {
try {
observer.onError(t);
} finally {
dispose();
}
}
}
@Override
public void onComplete() {
if (!isDisposed()) {
try {
observer.onComplete();
} finally {
dispose();
}
}
}
void dispose() {
// 取消訂閱
}
@Override
public boolean isDisposed() {
return false;
}
}
}
2.3、代碼二
YoEmitter YoObservableOnSubscribe YoObserver
public interface YoEmitter<T> {
void onNext(T value);
void onError(Throwable error);
void onComplete();
boolean isDisposed();
}
-------------------------------------------------------------------------
public interface YoObservableOnSubscribe<T> {
void subscribe(YoEmitter<T> emitter);
}
-------------------------------------------------------------------------
public interface YoObserver<T> {
void onSubscribe();
void onNext(T t);
void onError(Throwable e);
void onComplete();
}
3、輸出
3.1、原生輸出
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Throwable {
log("開始發送消息!");
e.onNext("A");
e.onNext("B");
e.onNext("C");
e.onComplete();
}
}).doOnNext(s -> log("發送消息:" + s));
observable.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
log("我剛被訂閱上,開始初始化工作!");
}
@Override
public void onNext(@NonNull String s) {
log("我接收到:" + s);
}
@Override
public void onError(@NonNull Throwable e) {
log("錯誤:" + e.getMessage());
}
@Override
public void onComplete() {
log("接受完成!");
}
});
//輸出結果
main:我剛被訂閱上,開始初始化工作!
main:開始發送消息!
main:發送消息:A
main:我接收到:A
main:發送消息:B
main:我接收到:B
main:發送消息:C
main:我接收到:C
main:接受完成!
3.2、手寫輸出
YoObservable yoObservable = YoObservable.create(new YoObservableOnSubscribe<String>() {
@Override
public void subscribe(YoEmitter<String> e) {
log("發送消息:A");
e.onNext("A");
log("發送消息:B");
e.onNext("B");
log("發送消息:C");
e.onNext("C");
e.onComplete();
}
});
yoObservable.subscribe(new YoObserver<String>() {
@Override
public void onSubscribe() {
log("我剛被訂閱上,開始初始化工作!");
}
@Override
public void onNext(String s) {
log("我接收到:" + s);
}
@Override
public void onError(@NonNull Throwable e) {
log("錯誤:" + e.getMessage());
}
@Override
public void onComplete() {
log("接受完成!");
}
});
//輸出
main:發送消息:A
main:我接收到:A
main:發送消息:B
main:我接收到:B
main:發送消息:C
main:我接收到:C
main:接受完成!