## 那些年我们错过的响应式编程
---
>
* 原文链接 : [The introduction to Reactive Programming you've been missing](https://gist.github.com/staltz/868e7e9bc2a7b8c1f754)
* 作者 : [@andrestaltz](https://twitter.com/andrestaltz)
* 译者 : [yaoqinwei](https://github.com/yaoqinwei)
* 校对者: [bboyfeiyu](https://github.com/bboyfeiyu)、[chaossss](https://github.com/chaossss)
* 状态 : 完成
相信你们在学习响应式编程这个新技术的时候都会充满了好奇,特别是它的一些变体,例如:Rx系列、Bacon.js、RAC等等……
在缺乏优秀资料的前提下,响应式编程的学习过程将满是荆棘。起初,我试图寻找一些教程,却只找到少量的实践指南,而且它们讲的都非常浅显,从来没人接受围绕响应式编程建立一个完整知识体系的挑战。此外,官方文档通常也不能很好地帮助你理解某些函数,因为它们通常看起来很绕,不信请看这里:
> **Rx.Observable.prototype.flatMapLatest(selector, [thisArg])**
> 根据元素下标,将可观察序列中每个元素一一映射到一个新的可观察序列当中,然后...%…………%&¥#@@……&**(晕了)
天呐,这简直太绕了!
我读过两本相关的书,一本只是在给你描绘响应式编程的伟大景象,而另一本却只是深入到如何使用响应式库而已。我在不断的构建项目过程中把响应式编程了解的透彻了一些,最后以这种艰难的方式学完了响应式编程。在我工作公司的一个实际项目中我会用到它,当我遇到问题时,还可以得到同事的支持。
学习过程中最难的部分是**如何以响应式的方式来思考**,更多的意味着要摒弃那些老旧的命令式和状态式的典型编程习惯,并且强迫自己的大脑以不同的范式来运作。我还没有在网络上找到任何一个教程是从这个层面来剖析的,我觉得这个世界非常值得拥有一个优秀的实践教程来教你**如何以响应式编程的方式来思考**,方便引导你开始学习响应式编程。然后看各种库文档才可以给你更多的指引。希望这篇文章能够帮助你快速地进入**响应式编程**的世界。
## "什是响应式编程?"
网络上有一大堆糟糕的解释和定义,如[Wikipedia](https://en.wikipedia.org/wiki/Reactive_programming)上通常都是些非常笼统和理论性的解释,而[Stackoverflow](http://stackoverflow.com/questions/1028250/what-is-functional-reactive-programming)上的一些规范的回答显然也不适合新手来参考,[Reactive Manifesto](http://www.reactivemanifesto.org/)看起来也只像是拿给你的PM或者老板看的东西,微软的[Rx术语](https://rx.codeplex.com/)"Rx = Observables + LINQ + Schedulers" 也显得太过沉重,而且充满了太多微软式的东西,反而给我们带来更多疑惑。相对于你使用的MV*框架以及你钟爱的编程语言,"Reactive"和"Propagation of change"这样的术语并没有传达任何有意义的概念。当然,我的view框架能够从model做出反应,我的改变当然也会传播,如果没有这些,我的界面根本就没有东西可渲染。
所以,不要再扯这些废话了。
#### 响应式编程就是与异步数据流交互的编程范式
一方面,这已经不是什么新事物了。事件总线(Event Buses)或一些典型的点击事件本质上就是一个异步事件流(asynchronous event stream),这样你就可以观察它的变化并使其做出一些反应(do some side effects)。响应式是这样的一个思路:除了点击和悬停(hover)的事件,你还可以给其他任何事物创建数据流。数据流无处不在,任何东西都可以成为一个数据流,例如变量、用户输入、属性、缓存、数据结构等等。举个栗子,你可以把你的微博订阅功能想象成跟点击事件一样的数据流,你可以监听这样的数据流,并做出相应的反应。
**最重要的是,你会拥有一些令人惊艳的函数去结合、创建和过滤任何一组数据流。** 这就是"函数式编程"的魔力所在。一个**数据流**可以作为另一个**数据流**的输入,甚至多个**数据流**也可以作为另一个**数据流**的输入。你可以_合并_两个**数据流**,也可以_过滤_一个数据流得到另一个只包含你感兴趣的事件的**数据流**,还可以_映射_一个**数据流**的值到一个新的**数据流**里。
**数据流**是整个响应式编程体系中的核心,要想学习响应式编程,当然要先走进数据流一探究竟了。那现在就让我们先从熟悉的"点击一个按钮"的**事件流**开始
![Click event stream](http://img.my.csdn.net/uploads/201504/13/1428914359_2150.png)
一个**数据流**是一个**按时间排序的即将发生的事件(Ongoing events ordered in time)**的序列。如上图,它可以发出3种不同的事件(上一句已经把它们叫做事件):一个某种类型的**值事件**,一个**错误事件**和一个**完成事件**。当一个**完成事件**发生时,在某些情况下,我们可能会做这样的操作:关闭包含那个按钮的窗口或者视图组件。
我们只能**异步**捕捉被发出的事件,使得我们可以在发出一个**值事件**时执行一个函数,发出**错误事件**时执行一个函数,发出**完成事件**时执行另一个函数。有时候你可以忽略后两个事件,只需聚焦于如何定义和设计在发出**值事件**时要执行的函数,监听这个**事件流**的过程叫做**订阅**,我们定义的函数叫做**观察者**,而事件流就可以叫做被观察的**主题**(或者叫被观察者)。你应该察觉到了,对的,它就是[**观察者模式**](https://en.wikipedia.org/wiki/Observer_pattern)。
上面的示意图我们也可以用ASCII码的形式重新画一遍,请注意,下面的部分教程中我们会继续使用这幅图:
```
--a---b-c---d---X---|->
a, b, c, d 是值事件
X 是错误事件
| 是完成事件
---> 是时间线(轴)
```
现在你对响应式编程事件流应该非常熟悉了,为了不让你感到无聊,让我们来做一些新的尝试吧:我们将创建一个由原始点击事件流演变而来的一种新的点击事件流。
首先,让我们来创建一个记录按钮点击次数的事件流。在常用的响应式库中,每个事件流都会附有一些函数,例如 `map`, `filter`, `scan`等,当你调用这其中的一个方法时,比如`clickStream.map(f)`,它会返回基于点击事件流的一个**新事件流**。它不会对原来的点击事件流做任何的修改。这种特性叫做**不可变性(immutability)**,而且它可以和响应式事件流搭配在一起使用,就像豆浆和油条一样完美的搭配。这样我们可以用链式函数的方式来调用,例如:`clickStream.map(f).scan(g)`:
```
clickStream: ---c----c--c----c------c-->
vvvvv map(c becomes 1) vvvv
---1----1--1----1------1-->
vvvvvvvvv scan(+) vvvvvvvvv
counterStream: ---1----2--3----4------5-->
```
`map(f)`函数会根据你提供的`f`函数把原事件流中每一个返回值分别映射到新的事件流中。在上图的例子中,我们把每一次点击事件都映射成数字1,`scan(g)`函数则把之前映射的值聚集起来,然后根据`x = g(accumulated, current)`算法来作相应的处理,而本例的`g`函数其实就是简单的加法函数。然后,当一个点击事件发生时,`counterStream`函数则上报当前点击事件总数。
为了展示响应式编程真正的魅力,我们假设你有一个"双击"事件流,为了让它更有趣,我们假设这个事件流同时处理"三次点击"或者"多次点击"事件,然后深吸一口气想想如何用传统的命令式和状态式的方式来处理,我敢打赌,这么�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
为了满足广大Android开发爱好者与从业者的学习需求,我们精心整理并上传了一份全面而实用的Android项目资源包。这份资源包内容丰富,涵盖了从基础知识到实战应用的全方位内容,旨在为开发者们提供一个便捷、高效的学习平台。 一、文件手册 资源包中的文件手册部分,详细记录了Android开发的核心知识点和常用技术。无论是初学者还是有一定经验的开发者,都能从中找到所需的学习资料。手册采用了简洁明了的排版方式,使得查阅更加方便快捷。同时,手册内容深入浅出,既适合新手入门,也能为老手提供有价值的参考。 二、项目实战与练习 为了让学习者能够将理论知识与实践相结合,我们特别准备了项目实战与练习部分。这部分内容包含了多个精心设计的Android项目案例,从需求分析、设计思路到实现过程,都有详细的讲解和代码示例。学习者可以通过实际操作,深入了解Android开发的整个流程,提升自己的实战能力。 此外,我们还提供了一系列练习题,旨在巩固所学知识,检验学习成果。这些练习题既有基础题,也有难度较高的挑战题,适合不同层次的学习者进行练习。 三、Android开发工具集 在Android开发过程中,选择合适的工具能够大大提高开发效率。因此,我们整理了常用的Android开发工具集,包括开发工具、测试工具、性能优化工具等。这些工具都是经过我们精心筛选和测试的,能够帮助开发者们更加高效地进行Android开发工作。 总的来说,这份Android项目资源包是一份不可多得的学习资料,无论你是初学者还是有一定经验的开发者,都能从中受益匪浅。我们希望通过这份资源包,为广大Android开发爱好者与从业者提供一个更加便捷、高效的学习平台,共同推动Android开发领域的发展。
资源推荐
资源详情
资源评论
收起资源包目录
【停止维护】一个定期翻译国外Android优质的技术、开源库、软件架构设计、测试等文章的开源项目.zip (320个子文件)
.DS_Store 16KB
.DS_Store 6KB
playstore.gif 5.63MB
.gitattributes 378B
.gitignore 68B
LICENSE 11KB
Binder框架解析.md 71KB
软件架构模式.md 61KB
为你的应用加速 - 安卓优化指南.md 39KB
readme.md 38KB
NotRxJava懒人专用指南.md 36KB
readme.md 36KB
MVP框架Mosby架构详解.md 35KB
readme.md 34KB
chapter02-chaossss.md 31KB
开始学习Material Design.md 30KB
Android数据绑定-再见Presenter,你好ViewModel.md 28KB
chapter04-dupengwei.md 27KB
如何使用Android-Studio把自己的Android-library分发到jCenter和Maven-Central.md 26KB
chapter01-BillonWang.md 25KB
readme.md 25KB
Android上MVP的介绍.md 25KB
开发你自己的Android授权管理器.md 24KB
Building a Kotlin project.md 23KB
重构Plaid-响应式的MVP模式.md 22KB
chap7.md 21KB
readme.md 20KB
使用Clean Architecture模型开发Android应用详细指南.md 20KB
Android进行单元测试难在哪-part4.md 20KB
chapter03-Mr.Simple.md 20KB
为什么在Android使用ClassLoader.getResourceAsStream会如此影响性能.md 19KB
Android之WebRTC介绍.md 19KB
Square:从今天开始抛弃Fragment吧!.md 19KB
Android中的MVP-Part2.md 18KB
详解Dagger2.md 18KB
创建-RecyclerView-LayoutManager-Part-1.md 18KB
开发安全的Android应用.md 17KB
readme.md 17KB
Android-Design-Support-Library.md 17KB
chap3.md 17KB
使用Facebook-SDK为安卓应用添加Like按钮.md 17KB
手动实现布局Transitions动画-第一部分.md 17KB
chap6.md 17KB
Android架构演化之路.md 17KB
chap2.md 17KB
在滚动列表中播放视频.md 17KB
Android-Reverse-Engineering-101-Part-4.md 17KB
让你了解数据加载的生命周期.md 17KB
适用于Android的Flux架构.md 17KB
检测和解决Android应用的性能问题.md 16KB
readme.md 16KB
一个内存泄漏引发的血案-Square.md 16KB
深入剖析Android网络开发库-part1.md 16KB
readme.md 16KB
在Android开发中使用RxJava.md 16KB
Android进行单元测试难在哪-part2.md 16KB
检测Android应用的启动与关闭.md 16KB
chap8.md 16KB
Android双向数据绑定.md 16KB
利用Retrofit和RxJava实现服务器轮询和出错重试.md 16KB
chap4.md 16KB
Android中的人脸检测入门.md 15KB
readme.md 15KB
Android中的AOP编程.md 15KB
创建-RecyclerView-LayoutManager-Part-3.md 15KB
readme.md 15KB
Android 10ms问题:关于Android音频路径延迟的解释.md 15KB
将基于Dagger-1开发的项目迁移到Dagger-2中.md 15KB
自动化Android开发.md 15KB
readme.md 15KB
Android进行单元测试难在哪-part3.md 15KB
2015-Google-IO带来的新Android开发工具 .md 15KB
readme.md 15KB
readme.md 14KB
在Java和Android中使用Optional.md 14KB
构建我的Presentation层.md 14KB
Android进行单元测试难在哪-part1.md 14KB
尝试结合Mosby和Flow代替Fragment.md 14KB
更加强大的Dagger2.md 14KB
readme.md 14KB
Android应用架构.md 14KB
使用TDD的方式开发一个Hackernews客户端.md 13KB
Android-MVPR-架构模式-Part1.md 13KB
Android中调试RxJava.md 13KB
如何提高你的代码质量.md 13KB
RxJava中repeatWhen 和 retryWhen 操作符的解释.md 13KB
通过CoordinatorLayout的Behavior拦截一切.md 13KB
Flux and Android.md 13KB
Android-Support库22.1版.md 13KB
Android dex分包导致的App启动速度下降.md 13KB
Layouts-Attributes-and-you.md 13KB
如何自定义Lint规则.md 12KB
README.md 12KB
readme.md 12KB
Android UI 自动化测试.md 12KB
Android-UI自动化测试.md 12KB
当钢铁侠变得反应更快-RxJava.md 12KB
创建-RecyclerView-LayoutManager-Part-2.md 12KB
readme.md 12KB
Android-M的App-Links实现详解.md 12KB
共 320 条
- 1
- 2
- 3
- 4
资源评论
01红C
- 粉丝: 1637
- 资源: 1098
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功