简介
让我们来介绍响应式编程。
响应式编程
响应式编程 最简单的定义是:使用可观察的数据流进行异步编程。
那么,这到底意味着什么?让我们逐步拆解。
异步编程
在响应式编程的语境中,异步编程是一个复杂概念。从传统意义上讲,它指的是以非阻塞方式编写程序,使耗时较长的任务在独立于主应用线程的环境中执行。从另一个角度看,它是一种事件驱动的编程风格,其中事件本身是异步的,可能在任意时刻到达。
可观察对象(Observable)
可观察对象 指的是可以被多个感兴趣其状态的观察者订阅的实体。当状态发生变化或有新事件到来时,该可观察对象会主动向所有订阅者推送更新。这就是经典的观察者模式。
数据流(Stream)
数据流可以理解为一系列有序的事件序列。这些事件可能在任意时刻到达,没有明确的开始或结束,并且通常由应用程序外部的源生成。
使用可观察数据流的异步编程
将上述概念重新组合后,可观察数据流就是一种可被订阅的事件序列,每当有新事件到来时,其订阅者就会收到通知。使用可观察数据流进行异步编程,是一种通过基于推送的观察者模式来处理数据流的方法,从而保持应用程序的响应性。
需要处理的数据流类型
Android 开发者无疑已经接触过多种类型的数据流。让我们思考一些可以通过响应式编程来处理的数据流示例:
-
用户生成的事件:点击事件、滑动手势、键盘输入、设备旋转等都是由用户触发的事件。如果我们将这些事件按时间轴排列,就能看出它们构成了一个有序的事件序列,即动态且可能无限的数据流。
-
I/O 操作:网络请求、文件读写、数据库访问等 I/O 操作是我们实践中最常应用响应式原则的数据流类型。由于这些操作需要较长时间且耗时不确定,因此本质上是异步的。返回的结果(如 JSON、字节数组或普通 Java 对象)也可以被视为一种数据流。
-
外部系统事件:来自服务器的推送通知、GCM 广播、设备传感器的更新,以及由外部生产者生成的事件,都具有与用户事件类似的动态性和潜在无限性。
-
几乎所有事物:实际上,几乎所有事物都可以建模为数据流。这正是响应式编程的核心理念。无论是单一标量值、对象列表、静态数据,还是动态事件,都可以在响应式世界中转化为数据流。
以上所有例子都是我们希望程序能立即响应的事件。响应式编程的本质就在于“响应”。
在响应式编程中,数据是第一公民。程序的运行由数据流动驱动,而非执行线程。我们所使用的库——RxJava,提供了一套完整而简洁优雅的 API,用于高效处理这些数据流。