Rxjava 2.x笔记(一)

这么火的框架,现在才开始学,实在是有点落伍(太落伍)了。因为2.x是独立于1.x的存在,所以为了尽快赶上时代潮流,本文基于2.x版本,整理一下学习中2.x的知识。因为是做笔记,所以肯定要参考大神的博客了。(当然,其中的代码咱会先敲一遍再贴上的,原来是用笔记本打笔记,当然查找的时候又不好查,可我喜欢用钢笔写字,唉,真是纠结…我想这篇文章的价值就是学习的同时,我会把踩到的坑跟大家说一遍,并尽量找到最优解决方案!)

这里写图片描述

首先,先贴一下大神地址:
[Season_zlc简书]([https://www.jianshu.com/p/464fa025229e](https://www.jianshu.com/p/464fa025229e))
**一、导入项目**
    implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'

二、Rxjava的工作原理:
这里写图片描述
上游,产生事件;下游,接收事件;两个水管(上下游)通过一定的关系联系起来,使得上游每产生一个事件,下游就能接收到事件。
上游和下游分别对应了RxJava中的Observable和Observer。他们之间的连接就对应着subscribe();
Tips:只有当上游和下游建立连接之后, 上游才会开始发送事件. 也就是调用了subscribe() 方法之后才开始发送事件.
坑:
这里写图片描述Observable要选第二个,不然会报错的。。
、、、、、、、、、、、、、、分割线、、、、、、、、、、、、、、、、、、、、
这里写图片描述
如上图,请在activity里写测试代码。。。我新建了一个类写Observable,,结果浪费了将近一个小时。。。
ObservableEmitter&Disposable:
ObservableEmitter:发射器,用于发送事件,调用emitter可以发出三种类型,onNext(T value),onComplete()和onError(Throwable error)。
虽然有三种类型,但也不是你想咋地就咋地的,人尚且得遵守法律,何况小小的发射器呢,咱们看看发射器的“宪法”:
1. 上游可以发送无限个onNext,下游也可以接受无限个onNext.(咳咳,上来就有点为所欲为了)
2. 当上游发送了一个onComplete后,上游onComplete之后的事件将会继续发送,而下游收到onComplete事件之后将不再继续接受事件。(上游是赤裸裸的高富帅特权)
3. 当上游发送了一个onError后,上游onError之后的事件将继续发送,而下游收到onError事件之后将不再继续接受事件。(你以为呢,你以为上边的就一个特权?还是太年轻!)
4. 上游可以不发送onComplete或onError
5. Most Important!onComplete和onError必须唯一并且互斥,即不能发送多个onComplete,也不能发送多个onError,也不能先发一个onComplete,然后再发一个onError,反之亦然(终于有个可以治他的了)
Disposable:可以了解为TT,起阻断作用,用完一次就扔。。。你懂得,类比上面水管的例子,就相当于两根管道之间的一个机关,当调用它的dispose()方法时,它就会将两根管道切断,从而导致下游收不到事件。(看来我这个栗子举得还不错)
Tips:上游不会因为发送了onComplete而停止.下游的onSubscribe()方法是最先调用的.

这里写图片描述
如上图,忘读者加些log自己跑一下看看,不要像我这么懒。

subscribe有几个重载方法:
public final Disposable subscribe() {}
public final Disposable subscribe(Consumer<? super T> onNext) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe) {}
public final void subscribe(Observer<? super T> observer) {}

**不带任何参数的subscribe()表示下游不关心任何事件,随上游随便作(充满父爱的眼神 =。=)
**带有一个Consumer参数的方法表示下游只关心onNext事件,其他的事件都视而不见,如果我们只需要onNext事件,那么事件就可以写的更简单一些了:
这里写图片描述
Ok,明天继续跟,今天到这,看慕课去喽~
继续…
正常情况下,上游下游都是在同一个线程中运行的
所以,既然说了正常情况下,那肯定有不正常的情况了;一般咱们用Handler和AsyncTask,其目的不过是让子线程进行耗时操作,让主页面只渲染个页面啥的(很明显的主仆关系),如果Rxjava连这个也实现不了的话,你觉得要他有何用?所以,来操作一波:
把上游发送事件的线程放到子线程中,下游接收还在main中。(子线程进行耗时操作)
这里写图片描述

相比上面的用法,这里很明显是多了两行:
.subscribeOn(Schedulers.newThread())
.observerOn(AndroidSchedulers.mainThread())
简单的说,subscribeOn指定的是上游所在线程,observerOn指定的是下游所在线程
多次指定上游所在线程只有第一次有用,其他的,不过是凑热闹罢了,一点用处没有。
但是多次指定下游所在线程确实每次都行,每指定一次,就切换一次。(此情此景,不像你年轻时爱着的她吗,无论是更漂亮的,还是更温柔的,都消减不了你对她的爱,可是后来啊,她走以后…到了年纪,倒觉得无论是谁,都能凑合搭伙过日子了,身边的人换了一个又一个,可你想想,你的爱情呢,你的唯一呢)
言归正传:ex:

Observable.subscribeOn(Schedulers.newThread())
.subscribeOn(Schedulers.newThread())//实际上这话是没有用的
                   .observeOn(AndroidSchedulers.mainThread())
                   .observeOn(Schedulers.io())
                   .subscribe(consumer);

Rxjava中有一些内定的线程类型供我们选择:
Schedulers.io():代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
Schedulers.computation(): 代表CPU计算密集型的操作, 例如需要大量计算的操作
Schedulers.newThread(): 代表一个常规的新线程
AndroidSchedulers.mainThread():主线程

猜你喜欢

转载自blog.csdn.net/qq_24820437/article/details/81843140