接上一篇手动写一个Rxjava和源码理解(一)事件的发送和订阅
第一篇文章分析了数据的发送和订阅,这一篇我们来分析一下RxJava2是怎么实现数据转换的
第一步,数据转换接口
public interface Function<T,R> {
R apply(T r);
}
第二步,需要实现一个数据转换被观察者
public class ObservableMap<T, R> extends Observable<R> {
Function<? super T, ? extends R> function;
ObservableSource<T> observableSource;
public ObservableMap(ObservableSource<T> observableSource, Function<? super T, ? extends R> function) {
this.function = function;
this.observableSource = observableSource;
}
@Override
protected void subscribeActual(Observer<? super R> observer) {
MapObserver<T, R> mapObserver = new MapObserver<>(observer, function);
observableSource.subscribe(mapObserver);
}
class MapObserver<T, R> implements Observer<T> {
Observer<? super R> observer;
Function<? super T, ? extends R> function;
public MapObserver(Observer<? super R> observer, Function<? super T, ? extends R> function) {
this.observer = observer;
this.function = function;
}
@Override
public void onSubscribe() {
}
@Override
public void onNext(T value) {
R t = function.apply(value);//数据类型转换的关键不走
observer.onNext(t);//数据类型转换后,通过观察者的接口传递数据
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
}
第三步,在Observable添加一个数据转换方法
public final <R> Observable<R> map(Function<? super T, ? extends R> function) {
return new ObservableMap<T, R>(this, function);
}
第四步,数据链调用
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableCreate.Emitter<Integer> emitter) throws Exception {
emitter.next(1);
emitter.next(2);
}
}).map(new Function<Integer, String>() {
@Override
public String apply(Integer r) {
return r+"";
}
}).subscribeOn(Schedulers.IO)
.observerOn(Schedulers.MAIN)
.subscribe(new Observer<String>() {
@Override
public void onSubscribe() {
Log.i(TAG, "onSubscribe");
}
@Override
public void onNext(String value) {
Log.i(TAG, "onNext:"+value);
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError");
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete");
}
});
总结:
ObservableMap是Observable的子类
Observable的map方法传入Function接口
MapObserver的onNext实现转换后的数据传递