RxJava 学习笔记
Posted 陈蒙_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RxJava 学习笔记相关的知识,希望对你有一定的参考价值。
文章目录
原理
编程方式
- 命令式编程
- 声明式编程
- 响应式编程
设计模式
核心类:Observable & Observer。
从设计模式的角度,使用了观察者模式,其中官方文档中也说其利用了 Reactor 模式(见 Observable Background 一节)。
其链式操作符形式类似 Builder 模式,区别在于 Builder 模式中方法的顺序通常不影响结果,而 RxJava 中操作符的顺序是影响结果的。链式操作符操作的 Observable 对象是上一个操作符产生的。
从上游生产下游消费的角度看,某种程度上类似生产者-消费者模式。
事件及事件流
Observer 订阅了 Observable,当 Observable 通过 OnSubscribe 调用了 Observer#onNext() 方法,我们称 Observable 发射(emit)了事件。通过链式反应,我们可以上一个 Observable 发射的结果传递给下一个 Observable,每次只完成一部分工作,最后将结果传递给 Observer 进行消费,这样就形成了一个事件流。其中每一部分的工作可以在单独的线程中完成。
典型的使用步骤是:
- 构造 Observer,包括 onNext()、onComplete()、onError() 方法,在上述方法中实现业务逻辑;
- 构造 Observable;
- 通过 subscribe() 方法将上述二者连接起来;
// defines, but does not invoke, the Subscriber's onNext handler
// (in this example, the observer is very simple and has only an onNext handler)
def myOnNext = it -> do something useful with it ;
// defines, but does not invoke, the Observable
def myObservable = someObservable(itsParameters);
// subscribes the Subscriber to the Observable, and invokes the Observable
myObservable.subscribe(myOnNext);
// go on about my business
关于发射事件的时机。有冷 Observable 和热 Observable 两种。冷 Observable,当调用 .subscribeI() 方法的时候发射。热 Observable,当其被创建的时候就开始发射事件。所以冷 Observable 的 Observer 收到的是部分事件流,而热 Observable 收到的是完整的事件流。
常用操作符
- .subscribeOn(),发射事件所在的线程,对应 OnSubscribe#call(),如果是耗时操作需要是单独的子线程;
- .observeOn(),接收事件所在的线程,对应 Observer#onNext();
- .map(),对上游 Observable 发射的事件对象进行转换,相当于是一道工序,处理完再传递给下游 Observable,从而形成事件流;
- .flatMap(),将上游一个 Observable 发射的多个对象转换成多个 Observable,然后在把多个 Observable 发射的对象铺平到一个 Observable,这个 Observable 负责将这些事件统一交给 Subscriber 的回调方法;
- .timeout(),设置超时时间,如果发射事件耗时超时了,就进入 Observer#onError() 方法,通过 TimeoutException 来区分,没有专门的超时回调方法;
优缺点
优点:使异步操作更加简洁,避免了回调的深层嵌套;
缺点:上手困难、容易出错,调试困难;
参考文章
以上是关于RxJava 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章