1.3.4 响应式编程

响应式编程(Reactive Programming)主要关注的是数据流的变换和流转,因此它更注重描述数据输入和输出之间的关系。输入和输出之间用函数变换来连接,函数之间也只对输入输出负责,因此我们可以很轻松地通过将这些函数调用分发到其他线程上的方法来实现异步,RxJava就是这样一个很好的例子。我们仍然以获取图片为例,用RxJava的Observable来实现,如代码清单1-22所示。

代码清单1-22 使用Observable


Observable.just("...")
  .map { download(it) }
  .subscribeOn(Schedulers.io()) //切换线程调度器
  .subscribe({ bitmap -> ... }, //省略图片处理逻辑
    { throwable -> ... }) //省略异常处理逻辑

上述代码看上去逻辑似乎与前面的Promise没有太大区别,对于只有一个元素输入的例子,RxJava提供了一个更合适也更像Promise的API,叫作Single。在代码清单1-22中我们直接用Single替换Observable即可,二者的不同之处在于Single只有一个结果,Observable则可以不停地发送事件而产生多个结果。

不过,Observable跟前面提到的Future和Promise有一个很大的不同,它的逻辑执行取决于订阅,而不是立即执行。此外,它还提供了任意变换之间可以切换线程调度器的能力,这一能力让复杂的数据变换和流转可以轻易实现异步。当然,这也曾一度让它被滥用为线程切换的工具。