变换的原理:lift()
变换的原理:lift()
简单示例代码:
第一个Observable的行为是发射一个字符串hello world,然后通过map进行变换,将字符串hello world的长度发射出来。最终由订阅者Action1进行输出
Observable.create(new Observable.OnSubscribe<String>() {
//subscriber为观察者,调用call执行操作时传入
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello world");
}
})
.map(new Func1<String, Integer>() {
@Override
public Integer call(String filePath) { // 参数类型 String
return filePath.length();
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer num) { // 参数类型 Bitmap
ALog.d("图片文件长度:"+num);
}
});
示例说明:
1、首先通过Observable.create创建了一个Observable对象,这里假设称为:leftObservable
2、leftObservable存储了被订阅者的行为Observable.OnSubscribe对象,最终会通过调用OnSubscribe的call方法完成任务调用及链式传递(通过调用subscriber.onNext()方法传递给订阅者)
3、在链式调用中再调用map时,实际上是通过leftObservable对象的lift方法又创建了一个新的Observable对象。这里称新的对象为rightObservable,同时创建了OperatorMap对象
4、此时的rightObservable持有了leftObservable的onSubscribe对象
5、OperatorMap实际上是一个Subscriber,内部通过MapSubscriber存放了rightObservable的行为对象Func1和最终的subscriber
6、当执行subscribe(subscribe)方法时,内部会通过hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
最终调用的代码如下
参考OnSubscribeLift类
@Override
public void call(Subscriber<? super R> o) {//o示例最终的subscriber Action1
try {
Subscriber<? super T> st = hook.onLift(operator).call(o);
try {
st.onStart();
parent.call(st);
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
st.onError(e);
}
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
o.onError(e);
}
}
方法说明:
1、Subscriber<? super T> st = hook.onLift(operator).call(o);这一句获取了operator的Subscriber(operator也是一个Subscriber),同时在operator中存放了示例的subscriber,此处用 actual表示
2、重点是parent.call(st);它实际上是调用leftObservable内call方法,且传递st即为OperatorMap对象
3、leftObservable的call方法内执行完内部的任何后,会调用st.next方法,实际上也是OperatorMap的MapSubscriber对象的onNext方法,代码如下
public void onNext(T t) {
R result;
try {
result = mapper.call(t); //此的mapper实际上是rightObservable的行为对象Func1,实际上是调用了map后的行为,并记录转换后的返回值
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
unsubscribe();
onError(OnErrorThrowable.addValueAsLastCause(ex, t));
return;
}
actual.onNext(result);//完成最终的订阅消息回调
}
4、至此完成了两个Observable的链式调用
示例代码引用库io.reactivex:rxjava:1.1.5