1.最近在群里听到最多的就是关于RxJava了,这个框架被很多人看好,是未来技术的主流。听了那么多关于RXJAVA的讨论,我早已按耐不住学习新技术的心了。虽然我还很菜,android基础知识都没玩透。android基本知识通过工作中的问题来学习,理解。课外时间研究下新技术。争取一年吧rxjava 玩好。
2.推荐文章https://mcxiaoke.gitbooks.io/rxdocs/content/Observables.html RxJava中文教程,这里面有很多名词运用的很到位,容易理解,介绍了RxJava的背景,由来,优点,解决什么问题等等这些引言。值得一看。
刚学习RxJava的时候,真的是搞不懂,建议先看看设计模式之观察者模式。我的博客中也有,举 的那个例子真心不错,可以看看。
今天主要记录的问题是。Observable(被观察者),Subscriber(观察者),OnSubscribe(订阅)。
先看一个demo:
这是一个被观察者创建的代码,通过静态方法create(onSubScribe)来实例化一个被观察者。
Observable myObservable=Observable.create(onSubscribe);
"订阅"对象的实例化:
Observable.OnSubscribeonSubscribe=new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
Toast.makeText(MainActivity.this, "hello Rxjava", Toast.LENGTH_SHORT).show();
}
};
Subscriber mySubscriber = new Subscriber() {
@Override
public void onNext(String s) {
Log.d("4577155", "Hello Rxjava");
}
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
};
观察者的实例化需要实现3个方法:分别是onnext,oncompleted,onerror方法。官方中文文档给的解释如下:
onNext(T item): Observable调用这个方法发射数据,方法的参数就是Observable发射的数据,这个方法可能会被调用多次,取决于你的实现。
onError(Exception ex):当Observable遇到错误或者无法返回期望的数据时会调用这个方法,这个调用会终止Observable,后续不会再调用onNext和onCompleted,onError方法的参数是抛出的异常。
onComplete:正常终止,如果没有遇到错误,Observable在最后一次调用onNext之后调用此方法。根据Observable协议的定义,onNext可能会被调用零次或者很多次,最后会有一次onCompleted或onError调用(不会同时),传递数据给onNext通常被称作发射,onCompleted和onError被称作通知。
rxjava 中文学习文档有几个概念很重要,值得我反复的阅读,揣摩。
1.观察者需要通过订阅与被观察者关联起来。
2.继续你的业务逻辑,等待方法返回结果,被观察者发射结果,观察者接收并且处理结果。
在刚开始学习的时候,我很困惑,不知道rxjava的代码风格为什么会是这样。不懂之间的调用关系。好在rxjava源码给写的通俗易懂,我这个菜鸟就能懂。接下来我来分析下源码。直接从下面这段代码开始查看源码:
obervable.subscribe(subscriber)
查看源码:看清楚subscribe(subscriber
我们继续查看Observable.subscribe(subscriber,this)这个方法的源代码:
其中核心代码就是这条了:
hook这个类是啥意思我也不清楚,不过不妨碍我们继续分析。hook.onSubscribestart(),这个方法 返还回来的是一个“订阅”对象,也就是observable.OnSubscribe。在通过查阅代码看看OnSubscribe里面咋写的。
这句话很有意思:当observable.subscribe(Subscriber)这个绑定方法被调用的时候,"订阅"对象将会调用它的call方法。注意call方法里面传递的参数 就是我们的“观察者”。也就是observable.subscribe(Subscriber)这个方法的参数。。。写在这里 我突然对onnext()方法的解释产生质疑。感觉应该是Subscriber调用onnext接收处理数据。不知道是不是翻译过来出问题了。
总结下:这个demo运行的流程:首先实例化Observable对象,onSubscribe对象(订阅)以及subscribe(观察者)对象。然后调用subscribe(),方法绑定观察者和被观察者。
绑定了之后,通过一些列的代码最终会执行到 onSubscribe.call(Subscriber)这个方法。在这个call方法里面我们可以调用观察者的onnext,oncompleted。onerror方法。
下面我来验证下是不是这么个流程:
看API我们知道 Observable的初始化,也可以通过如下的代码来创建一个Observable对象。
Observable myObservable = Observable.just("Hello, world!");
Action1 action1=new Action1() {
@Override
public void call(String s) {
}
};
myObservable.subscribe(action1);
这个demo和上面给的那种方式的demo最终运行效果是一样的。
但是很明显Subscriber,明显被Action1对象取代了。
查看Action1接口发现:
这个Action1接口里面就是一个call方法。
我们在通过查看myObservable.subscriber(Action1).这个方法的源码。看下里面是怎么运作的。
相当于myObservable.subscriber(Action1).这条代码等价于myObservable.subscriber(Subscriber)这条代码。.
博客写在这里的时候,我自己就有一个疑问,根据我们上面的结论 必须先调用“订阅对象的call方法”,然后观察者在订阅对象的call方法中调用onnext方法。但是实际运行结果是能弹出一句话。。但是我并没有在代码中看到对Onsubscribe(订阅)的赋值啊,我的影像中这个对象为null。才对为毛还是可以呢。
最后我查看了observable.just创建方法。发现了
系统内部创建了一个OnSubscribe方法,并且在call里面执行了onnext方法,。最终发现通过Action的流程和我上面分析的也是吻合的。不过话说回来。这里的Action1的作用价值体现在哪呢。
最后根据变量命名分析:原来action在这里就是等与onNext的,观察者里面的onNext方法执行的是 Action1.call(T t)...系统那把这个Action1的变量命名为onNext.,说明Action1,对象通过call方法。来处理接收到的数据。
这些都是我今晚的理解,又不对的地方请指出。大概算是明白了Subscribe,observable,和onSubscribe之间 的关系。