RxJava2 学习笔记

函数响应式编程

函数响应式编程的思维是将问题抽象为数据加工,一切问题都是数据源发出数据的问题,所以用函数响应式编程需要先将问题抽象出下面的模型:

  • 数据生产者,即数据源,数据是从哪儿生成的
  • 原始数据:数据源发出的原始数据
  • 最终数据: 数据最终形态
  • 数据加工: 原始数据是如何变成最终形态的数据

如要在界面上显示在线用户的年龄,可以分解为:

  • 网络获取用户的出生日期
  • 对出生日期加工为年龄

RxJava2

有了抽象模型, RxJava 中要做的很简单:

  • 构建一个原始数据源
  • 构建加工器,放置在数据源的出口上, 形成一个新的数据源

第一步,构建一个出生日期的数据源:

Observable.create{emitter -> 
    val birthDate = getBirthDateFromNetwork()
    emitter.onNext(birthDate)
}

第二步,对数据源加工为新的数据源:

Observable.create(...).map {birthDate ->
    now.getYear()-birthDate.getYear()
}

RxJava 的事件

一个数据在流动的过程中,理想的情况是最终按照预期的变成最终的数据。但是现实总会很残酷,始上边的例子中,网络就很易出问题。所以 RxJava 中将事件抽象为下边几种:

  • 数据事件: next, 事件带一个数据参数
  • 错误事件: error, 对应数据流动过程中出现的各种异常情况
  • 完成事件: complete, 指示不会再有 next 事件了

在一个数据流中,通常是0到多个 next 事件,然后1个complete 或 1 个 error 事件.

用 RxJava 的事件来重写上边例子,加入了error事件和 complete 事件:

Observable.create{emitter -> 
    try {
        val birthDate = getBirthDateFromNetwork()
        emitter.onNext(birthDate)
        emitter.onComplete()
    }catch {error ->
        emitter.onError(error)
    }
}.map {birthDate ->
    now.getYear()-birthDate.getYear()
}

RxJava 中根据事件将数据源 Observable 分为下边几类:

数据源类 说明
Observable 0或多个next + 1个 [complete 或 error]
Single 1 个 [next 或 error]
Maybe 1 个 [complete 或 error], 注意 complete 是带一个数据参数的
Completable 1 个 [complete 或 error]

你可能感兴趣的:(RxJava2 学习笔记)