函数响应式编程
函数响应式编程的思维是将问题抽象为数据加工,一切问题都是数据源发出数据的问题,所以用函数响应式编程需要先将问题抽象出下面的模型:
- 数据生产者,即数据源,数据是从哪儿生成的
- 原始数据:数据源发出的原始数据
- 最终数据: 数据最终形态
- 数据加工: 原始数据是如何变成最终形态的数据
如要在界面上显示在线用户的年龄,可以分解为:
- 网络获取用户的出生日期
- 对出生日期加工为年龄
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] |