学习方法:
一、先看这博主的前三章,很好的入门文章
博主A的网址:https://www.jianshu.com/u/c50b715ccaeb
1、给初学者的RxJava2.0教程(一)
重点:作者用水管来解析Rxjava,通俗易懂,上游,下游,连接水管。
细节:
(1) 方法1 subscribe(Observer<? super T> observer) 是最全面的,但Observer要实现的方法很多,很多人想简单一点,就用Consumer。带有一个Consumer
参数的方法表示下游只关心特定一个事件(例如:onNext), 其他的事件假装没看见。
方法3,只关注onNext事件
方法4,关注onNext事件和onError事件,这个很常用。
public final void subscribe(Observer<? super T> observer) {}
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) {}
重点:在如果在onNext方法体里面抛异常,会在onError中捕捉到。在方法4中做的实验,估计在方法1也是这样处理
(2)发射事件,需要满足一定的规则:
- 上游可以发送无限个onNext, 下游也可以接收无限个onNext.
- 当上游发送了一个onComplete后, 上游onComplete之后的事件将会
继续
发送, 而下游收到onComplete事件之后将不再继续
接收事件. - 当上游发送了一个onError后, 上游onError之后的事件将
继续
发送, 而下游收到onError事件之后将不再继续
接收事件. - 上游可以不发送onComplete或onError.
- 最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError, 也不能先发一个onComplete, 然后再发一个onError, 反之亦然
重点:
一个主线程,三个子线程
AndroidSchedulers.mainThread() 代表Android的主线程
Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
Schedulers.newThread() 代表一个常规的新线程
Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作
主要写函数,但博主A的Rxjava函数使用方法写得没这位博主B后,请看第二点的文章
(先看完下面的“二、主要看博主B的函数使用方法”,再回过头来看第4点以下的文章)
4、给初学者的RxJava2.0教程(七) Flowable的学习 - 1
主要内容:
(1)BackpressureStrategy,设置模式,水缸装不下时的处理方法
BackpressureStrategy.ERROR,装不下就抛出了MissingBackpressureException异常
BackpressureStrategy.BUFFER, 无限容量的新水缸啦。这种模式下FLowable和Observable是一样。
BackpressureStrategy.DROP,Drop就是直接把存不下的事件丢弃
BackpressureStrategy.LATEST,就是只保留最新的事件
(2)Flowable 怎样中断事件 ,
答:和Observable差不多 :Disposable mDisposable =oneFlowable.subscribe(new Consumer()...
但有一个特殊,Flowable onSubscribe返回的是一个Subscription s,(Observable.onSubscribe直接返回 Disposable d)。
Subscription.cancel()作用等同于disposable.dispose();
5、给初学者的RxJava2.0教程(八) Flowable的学习 - 2
主要内容:
(1)BackpressureStrategy,设置模式,水缸装不下时的处理方法
BackpressureStrategy.ERROR,装不下就抛出了MissingBackpressureException异常
BackpressureStrategy.BUFFER, 无限容量的新水缸啦。这种模式下FLowable和Observable是一样。
BackpressureStrategy.DROP,Drop就是直接把存不下的事件丢弃
BackpressureStrategy.LATEST,就是只保留最新的事件
6、给初学者的RxJava2.0教程(九) RxJava2 背压 Flowable ,原文 Flowable的学习 - 3
Flowable 中断事件
Flowable的mSubscription=0,上游继续发,就会用BackpressureStrategy的设置模式,触发相应事件。如果设置为BackpressureStrategy.ERROR就会抛异常,而出错会触发停止
二、主要看博主B的函数使用方法
博主B对Rxjava的理解比不上博主A,但对函数的使用方法写得很好
1、Observable 用于订阅 Observer,不再支持背压(1.x 中可以使用背压策略),
而 Flowable 用于订阅 Subscriber
2、采用 concat 操作符先读取缓存再通过网络请求获取数据
concat 要求两个上游的泛类(输出结果)一样
使用场景很多时候都需要我们先读取缓存的数据,如果缓存没有数据,再通过网络请求获取,随后在主线程更新我们的UI。
3、flatMap 实现多个网络请求依次依赖
想必这种情况也在实际情况中比比皆是,例如用户注册成功后需要自动登录,我们只需要先通过注册接口注册用户信息,注册成功后马上调用登录接口进行自动登录即可。
4、just 发送一个空的上游事件,可以用来切换线程
5、采用 interval 操作符实现心跳间隔任务
6、doOnNext函数,是一个observe,作用是插入处理,不影响总流程,observeOn控制其(doOnNext)工作的线程,不是subscribeOn
7、Delay
Observable.just("Amit")
//延时两秒,第一个参数是数值,第二个参数是事件单位
.delay(2, TimeUnit.SECONDS)...
-------------------------------------------------------------------------
#### 零散的知识点(或者bug)####
1、Rxjava Disposable解除订阅(Retrofit2+Rxjava2主动取消网络请求)
2、Rxjava 如果没有写明 Throwable (下面这行代码),就会把异常抛到外面 。一般情况记得加上下面这句
new Consumer<Throwable>()
3、Thread 中使用 RxJava可能会导致闪退。(一般不会这样用,因为有了Rxjava一般不会用Thread)
private class GetCameraTokenTask extends Thread{
public void run() {
//observeOn(AndroidScheduler.mainThread())会闪退,observeOn(Schedulers.io())不会
Disposable disposable=call.subscribeOn(Schedulers.io()).observeOn(AndroidScheduler.mainThread()).subscribe()
}
}
5、Rxjava+Retrofit 请求返回的数据是String,返回的类型直接写ResponseBody,写String 或者 Object(返回的值没有了双引号)不行。
Observable<ResponseBody> login2(@Body BaseReq<LoginRequest> loginReq);
....
@Override
public void onNext(ResponseBody baseRes) {
L.w("tan","onNext");
//L.w("tan",baseRes.resultMsg);
try{
L.w("tan",baseRes.string());
}catch (Exception e){
e.printStackTrace();
}
}