RxJava 2.x 教程(学习目录)(B)

学习方法:

一、先看这博主的前三章,很好的入门文章

博主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, 反之亦然

 

2、给初学者的RxJava2.0教程(二)

重点:

一个主线程,三个子线程
AndroidSchedulers.mainThread()  代表Android的主线程
Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
Schedulers.newThread() 代表一个常规的新线程
Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作

3、给初学者的RxJava2.0教程(三) 

主要写函数,但博主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,但对函数的使用方法写得很好

文章:这可能是最好的RxJava 2.x 教程(完结版)

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()
  }
 }

4、RXJava找不到AndroidSchedulers

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();
     }

 }
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值