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 来区分,没有专门的超时回调方法;

优缺点

优点:使异步操作更加简洁,避免了回调的深层嵌套;
缺点:上手困难、容易出错,调试困难;

参考文章

  • Observable
  • RxJava
  • 给 Android 开发者的 RxJava 详解
  • 拥抱 RxJava(三):关于 Observable 的冷热,常见的封装方式以及误区
  • Reactor 模式简介

你可能感兴趣的:(Java,编程)