Rxjava 最本质的概念还是观察者模式 而观察者模式是
定义了对象间一对多的依赖关系,使得当对象状态发生变化时,所有依赖它的对象都会收到通知并且自动更新自己。
观察者模式 比较不错的学习文章 可以看这个 http://www.jianshu.com/p/d5a758dd2795 初学者学习设计模式 很容易理解
RxJava 有四个基本概念:Observable(可观察者,即被观察者)、Observer(观察者)、subscribe(订阅)、事件。
Observable和Observer通过subscribe()方法实现订阅关系,从而Observable可以在需要的时候发出事件来通知Observer。
这几个单词大家一定要记住是什么意思 我刚刚学习的时候 也是老是忘记 所以才写下这篇文章 自己写一遍 加深印象
根据观察者的设计模式就很好的可以理解了 Observer(观察者) subscribe(订阅)Observable(可观察者,即被观察者)
说的很通俗一点了 就是我观察了你 你做什么事情我都知道你要干嘛 而这个观察就是通过subscribe(订阅来实现的)
除了Observer接口之外,RxJava 还内置了一个实现了Observer的抽象类:Subscriber。Subscriber对Observer接口进行了一些扩展,但他们的基本使用方式是完全一样的:
不过 大家发现 代码 都是 Observable(即被观察者) subscribe (订阅)Observer(观察者)
Observable(即被观察者) subscribe (订阅)Subscriber(观察者)
以上代码意思都是一样的 都是被观察者订阅了观察者。 (看图1.0.0)
不仅基本使用方式一样,实质上,在 RxJava 的 subscribe 过程中,Observer也总是会先被转换成一个Subscriber再使用。所以如果你只想使用基本功能,选择Observer和Subscriber是完全一样的。它们的区别对于使用者来说主要有两点:
onStart(): 这是Subscriber增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行),onStart()就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用doOnSubscribe()方法,具体可以在后面的文中看到。
unsubscribe(): 这是Subscriber所实现的另一个接口Subscription的方法,用于取消订阅。在这个方法被调用后,Subscriber将不再接收事件。一般在这个方法调用前,可以使用isUnsubscribed()先判断一下状态。unsubscribe()这个方法很重要,因为在subscribe()之后,Observable会持有Subscriber的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如onPause()onStop()等方法中)调用unsubscribe()来解除引用关系,以避免内存泄露的发生。
![](https://i-blog.csdnimg.cn/blog_migrate/a04c13c7accd664c66c3a5f53d79a0ab.webp?x-image-process=image/format,png)
大家可以很明显的看到了是被观察者订阅了观察者 (以上代码是基于Rxjava 2.1.0的版本)
这个大家在逻辑上就有点接受不来了 就像 这看起来就像『杂志订阅了读者』一样颠倒了对象关系 但是既然Rxjava是这样的设计 大家也没有必要非要纠结了
大家可以看到被观察者的实现 模式 一般是 Observable.create();采取的是build的模式
而观察者一般都是new 比如这里 new ConSumer() 出来的对象 这点大家要稍微注意一点
抛物线大佬增加说过:
RxJava 到底是什么
一个词:异步。
大家还是看代码 图1.0.0很好的实现了异步的操作
在android 中异步的场景还是有很多的 最常见的就是从服务端获取数据 通常呢 一般都是在后台进行,而显示数据呢 需要在主线程中进行(UI线程)所以 异步在android 中还是十分需要的。
那么RxJava 怎么实现异步呢?
subscribeOn(Schedulers.io());
observeOn(AndroidSchedulers.mainThread());
就是这么简短的两句话就实现了异步的过程 。
这里讲一讲它们之间的区别:
subscribeOn():指定Observable(被观察者)自身在哪个调度器上执行
observeOn() :指定一个观察者在哪个调度器上观察这个Observable(被观察者)