作用: 將Observable所發送送的信息進行格式轉換或者處理,然後轉變爲另外一個類型,發送給Observer
思路:
一、ObservableCreate
二、ObservableMap
三、調用思路和源碼邏輯
四、生產環境代碼
五、畫圖總結
ps:
subscribe() 是Observable中的的方法,因爲ObservableCreate和ObservableMap都繼承了Observable所以把該方法放到了這兩個類中
一、ObservableCreate
public final class ObservableCreate<T> extends Observable<T> {
final ObservableOnSubscribe<T> source;
public ObservableCreate(ObservableOnSubscribe<T> source) {
this.source = source;
}
@Override
void subscribe(Observer<? super T> observer) {
subscribeActual(observer);
}
//
@Override
protected void subscribeActual(Observer<? super T> observer) {
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
observer.onSubscribe(parent);
source.subscribe(parent);
}
static final class CreateEmitter<T>
extends AtomicReference<Disposable>
implements ObservableEmitter<T>, Disposable {
private static final long serialVersionUID = -3434801548987643227L;
final Observer<? super T> observer;
CreateEmitter(Observer<? super T> observer) {
this.observer = observer;
}
@Override
public void onNext(T t) {
if (!isDisposed()) {
observer.onNext(t);
}
}
@Override
public void onComplete() {
observer.onComplete();
}
}
}
二、ObservableMap
ObservableMap extends Observable{
ObservableSource<T> source; //指ObservableCreate
public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) {
super(source);
this.function = function;
}
@Override
void subscribe(Observer<? super T> observer) {
subscribeActual(observer);
}
//
@Override
public void subscribeActual(Observer<? super U> t) {
source.subscribe(new MapObserver<T, U>(t, function));
}
static final class MapObserver<T, U> extends BasicFuseableObserver<T, U> {
final Function<? super T, ? extends U> mapper;
Observer<? super R> actual;
MapObserver(Observer<? super U> actual, Function<? super T, ? extends U> mapper) {
super(actual);
this.mapper = mapper;
}
@Override
public void onNext(T t) {
U v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
actual.onNext(v);
}
}
三、分析調用流程
1.第一塊
發起點:訂閱與map操作符操作
源碼中可以看到create() 創建了ObservableCreate
map() 創建了ObservableMap
map().subscribe(observer1) 其實是調用的 ObserbableMap的 subscribe() ——>subscribeActual()
ObserbableMap中的subscribeActual (Observer t ){
source.subscribe(new MapObserver<T, U>(t, function));
}
發現:observer1已經被包裝成了MapObserver
source是誰?從哪裏來??? : source.subscribe(new MapObserver<T, U>(t, function));
2.第二塊
其實在ObserbableMap是調用的ObservableCreate的 map()方法創建的,代碼如下:
public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
}
this : 指的是當前對象,當前對象就是ObservableCreate
ok那下一步就是調用ObservableCreate的subscribe()方法
3.第三塊:
ObservableCreate{
@Override
void subscribe(Observer<? super T> observer) {
subscribeActual(observer);
}@Override
protected void subscribeActual(Observer<? super T> observer) {
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
observer.onSubscribe(parent);source.subscribe(parent);
}}
source 是誰? 是observableOnSubscribe1
parent 是誰? parent是CreateEmitter的一個實例,包裹了MapObserver的對象
observableOnSubscribe1代碼:{
ObservableOnSubscribe observableOnSubscribe1 = new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
};emitter.onNext(1);代碼如下:{
public void onNext(T t) {
observer.onNext(t);
}
observer是MapObserver的一個實例被包裝在了CreateEmitter中
observer.onNext(t); 代碼如下{
Observer<? super R> actual;
public void onNext(T t) {
U v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
actual.onNext(v);
}actual是實例observer1
}
}
四、生產環境代碼
//創建一個下游 Observer
Observer<Integer> observer1 = new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d("donghe", "subscribe");
}
@Override
public void onNext(Integer value) {
Log.d("donghe", "" + value);
}
@Override
public void onError(Throwable e) {
Log.d("donghe", "error");
}
@Override
public void onComplete() {
Log.d("donghe", "complete");
}
};
Function function1 = new Function<Integer, Object>() {
@Override
public Object apply(Integer integer) throws Exception {
return null;
}
};
ObservableOnSubscribe observableOnSubscribe1 = new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
};
//創建一個上游 Observable:
Observable.create(observableOnSubscribe1).map(function1).subscribe(observer1);
五、調用邏輯順序