RxAndroid热身系列--什么是Rx

The introduction to Reactive Programming you’ve been missing
那些年,你错过的响应式编程。
作者在开篇说到,Learning is hard,如果没有好的学习材料就更苦了。
他提出,最难的部分是以”响应式的方式去思考”,你必须摒弃以前固有的编程习惯,强迫你的大脑在另一种范式下工作。在看了作者这篇实用性的教程后,再去看Library documentation,会有事半功倍的效果.
“What is Reactive Programming?”
那么,究竟什么是响应式编程。
Wikipedia 太通用,太理论
Stackoverflow 回答过于权威,不适合新手
…..
作者真是好人啊!
Reactive programming is programming with asynchronous data streams.
响应式编程就是对异步的数据流进行编程。这并不是什么新东西。Event buses和典型的点击事件都是异步事件流,你可以监听这些事件,然后do something!Reactive是这一思想的升级,加强版!你可以创建出任何数据流,不仅仅是点击事件, 悬浮事件。你可以为变量,用户输入,属性,缓存,数据结构等等创建数据流,数据流变得无处不在。
On top of that, you are given an amazing toolbox of functions to combine, create and filter any of those streams.
首先,你得先理解游戏诶函数工具箱,这些函数能够组合,创建,过滤数据流。
这就是“函数式”的魔力了。一种流或者多种流都可以作为另一种流的输入。你可以把两种流组合起来。你可以过滤某一种流而得到另外一种流(流是immutable的),你也可以将一种流映射为另一种流。
要想理解Reactive,必须先理解流,以点击事件为例,上图:
这里写图片描述
流是“进行中的,在时间上有序的事件”,他可以发送三种不同的东西,value,error,completed signal。
我们可以异步的捕获这些事件,通过定义一系列函数做自己的事情,如收到的是value,收到的是error,收到的是completed.
即,监听流!he “listening” to the stream is called subscribing.
也叫订阅,观察者模式不也称作“发布-订阅”模式吗。我们自己所定义的函数当然是在观察者中,流是我们要观察的对象(“Observable”)。

--a---b-c---d---X---|->

a, b, c, d are emitted values
X is an error
| is the 'completed' signal
---> is the timeline

接下来,we are going to create new click event streams transformed out of the original click event stream.
我们要在原来点击事件流的基础上创建出新的点击事件流,还是那句话,流是不可改变的,you can not change history!
首先,我们创建一个counter流来记录button被点击了多少次。
在通用的Reactive库中,每一种流都绑定了很多函数,如map,filter,scan,当你调用这些函数时,他会返回新的流。

  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)将前一个流所发送的值全部累积起来,也就是加法操作。
下面再更深一点,见识一下Reactive的真实力量。我们现在需要一个”双击事件”,或者“三连击”的流。想像一下传统的处理方式吧。
有了Reactive就简单多了,我们先不看代码,想像一下怎样来建立流,疏通整个流程。
这里写图片描述
横轴为时间轴。
灰色部分代表函数,他们负责流的转换(创建出新的流)。
首先,算出列表中的点击事件,以250ms为间隙。我们先不考虑细节。
得到的结果是lists流,然后再对它执行map()操作,将集合映射为集合的长度的流,整数(集合长度)流,然后,再执行filter流,过滤掉那些值为1的流,最终得到我们想要的流,我们就可以直接将这些流发送给订阅者了。
“Why should I consider adopting RP?”
为什么要采用响应式编程?
RP提高了代码的抽象层次,你可以专注于事件之间的相互依赖,从而定义业务逻辑,而不用无休止的处理实现细节,整体上,代码会更加整洁.
在现在的前端应用和移动应用上的优势更明显,因为现在UI事件和数据关联起来,并且交互特别频繁。在10年前,web页面的交互基本是客户端提供一个常常表单给服务器,服务器返回数据显示到前端。应用进化得更加实时了,对单一操作区域的改动使得服务端执行”保存”操作。
Thinking in RP, with examples
采用实例的方式来思考RP。
是时候做点实事了。
遗憾的是,作者选择了js,而不是java。
Implementing a “Who to follow” suggestions box
这里写图片描述
我们在此将着重模仿核心特征:
1.在启动时,加载用户数据,显示
2.当用户点击“Refresh”的时候,加载3个另外的用户数据。
3.当用户点击”x”时,清楚被点击的用户,显示另一个用户
4.每一行都显示用户的头像和他们的主页链接
完整代码:

http://jsfiddle.net/staltz/8jFJH/48/

Request and response
我们应该怎样才能用Rx解决这个问题呢?首先,我们需要牢记,任何东西都可以看成流。这是Rx的口头禅。
先从最简单的特征开始:”在启动时,从API加载3个用户数据”.
1.执行请求—>2.拿到响应—>3.发动响应内容
我们将请求看作流.
现在,我们只需要执行一次请求,发送一个数据,后面会更复杂,总之,先看简单的.

--a------|->
Where a is the string 'https://api.github.com/users'

这个流的内容是我们要请求的url,当一个请求事件发生时,我们需要知道两件事,when和what。
“流”的官方术语是“Observable”

var requestStream = Rx.Observable.just('https://api.github.com/users');

。。。。未完待续!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值