对于Rxjava的学习使用(一)
之前看了过网上的 吴拉丁大神 写的相关文章。自己在总结一下,方便以后复习、查看。
原文链接:
https://www.jianshu.com/p/6fd8640046f1 《关于RxJava最友好的文章》
https://www.jianshu.com/p/e61e1307e538 《关于RxJava最友好的文章————进阶》
最初还是提供一个 开关 与 台灯的例子。
//创建一个被观察者(开关)
Observable switcher=Observable.create(new Observable.OnSubscribe<String>(){
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("On");
subscriber.onNext("Off");
subscriber.onNext("On");
subscriber.onNext("On");
subscriber.onCompleted();
}
});
//创建一个观察者(台灯)
Subscriber light=new Subscriber<String>() {
@Override
public void onCompleted() {
//被观察者的onCompleted()事件会走到这里;
Log.d("DDDDDD","结束观察...\n");
}
@Override
public void onError(Throwable e) {
//出现错误会调用这个方法
}
@Override
public void onNext(String s) {
//处理传过来的onNext事件
Log.d("DDDDD","handle this---"+s)
}
//订阅
switcher.subscribe(light);
流程图
“Observable.create(new Observable.OnSubscribe<String>()” 中的 OnSubscribe 是链接“台灯”和“开关”的关键
理解的关键步骤
- 订阅这个动作,实际上是观察者(subscriber)对象把自己传递给被观察者(observable)内部的onSubscribe。
onSubscribe的工作就是调用call(subscriber)来通知被观察者发送消息给这个subscriber。
以上的结论对于下面我们理解操作符的原理十分有帮助,因此一定要看明白。
操作符的理解
按 map 操作符举例
public final <R> Observable<R> map(Func1<? super T, ? extends R> func)
{
//创建了全新代理的的Observable,构造函数传入的参数是OnSubscribe
//OnSubscribeMap显然是OnSubscribe的一个实现类,
//也就是说,OnSubscribeMap需要实现call()方法
//构造函数传入了真实的Observable对象 //和一个开发者自己实现的Func1的实例
return create(new OnSubscribeMap<T, R>(this, func));
}
- 1 他会将传入的参数交给他 特定的‘观察者’实现类—->
- 2 在这个实现类的 call 方法中将参数传给一个内部的代理类,在将这个代理类添加到‘观察者’的SubscriptionList集合中(应该是用来处理多个代理类的)—>
- 3 让外部的‘被观察者’去订阅者代理类。
理解的流程图
对流程图的描述
1 通过调用“被观察者”的 .subscribe() 方法发起订阅 –> 来到了 “被观察者”的唯一属性onSubscribe –>调用 onSubscribe.call()方法,将我们自己创建的‘观察者’传进call(),现在真正发送了事件!
2 在call 方法中传进去的 ‘观察者’ 转换成‘代理观察者’—> 让外部的‘被观察者’,来订阅这个‘代理观察者’
3 通过onNext(),将参数回调给“代理观察者”。
4 在通过onNext(),将参数回调给“观察者”,就可以将在这里拿到的参数,进行需要的操作了。
- 实际上看源码 可能由于版本的关系 和原作者贴的源码不太一样,就先这么理解吧。