RxAndroid热身系列(一)

原文链接
本文是对该文章的一个简洁版笔记,并没有一字一句的翻译过来,尽可能的做到在逻辑上畅通,记录的过程也是自己理解的过程。
Android程序的每一个UI元素都是可以发出事件,如Button可以发出“click”事件,而我们只需要监听这些事件。
设置监听器来监听这些事件是我们通常的做法。
但是,现在有了RxJava库和RxAndroid库。这两个库添加了”函数式响应编程”,使得处理异步多事件变得简洁。
一、Functional Reative Programming(FRP)
由两种编程模型组成
1.函数式编程
这种模型可以通过”map”,”filter”,”reduce”来改变和组合生成新的流序列。事件是无法改变的,你只能生成新的。
2.响应式编程
该模型专注于数据流和改变传播方式
二、Observable and Observer
RxJava使用的是观察者模式。
Observable发射数据,Subscriber消费事件。
RxAndroid热身系列(一)_第1张图片
上述代码表示创建一个Obervable,一旦Subscriber”订阅”了这个Observable,那么call()方法就会被调用。
RxAndroid热身系列(一)_第2张图片
现在,helloObservable有了两个订阅者.
如果你改变了Observable中发射的内容,那么Subsciber中收到的内容也会改变,这就是改变传播的体现
三、Transformation
此乃”Functional Programming”的体现,允许我们变换Observable。
现在,我们改变一下Observable的创建方式
RxAndroid热身系列(一)_第3张图片
注意,names必须是Iterable的。原文如下:
The Observable is built using from method. The subscribers will receive the item from the Iterable collection one by one。
改变,如果我们想对原生的流做一些改变,我们可以使用map方法,该方法可以改变Observable发送的值.
RxAndroid热身系列(一)_第4张图片
map方法将原生的值改成了大写,再将数据发射给Subscriber。
四、Lambda expression
在java8中出现,主要是为了避免繁琐的匿名函数。在Lambda中,我们只需要声明一个变量和返回值即可。
RxAndroid热身系列(一)_第5张图片
我的理解是s是函数形参,s.toUpperCase()为方法中的实际内容,可以用大括号括起。
这里写图片描述
五、Doing it in Andorid
制作一个注册的表格,要求如下:
1.在初始状态下,每一个区域都是空白的
2.如果某一块区域是有效的,文本将显示为黑色
对于email,用简单的正则即可
对于名字,只要大于4个字符就好
3.如果某一区域是无效的,文本将显示为红色
4.只有当两块区域都是有效的,Register按钮才会被激活
RxAndroid热身系列(一)_第6张图片

Capturing Events 捕捉事件
RxAndroid热身系列(一)_第7张图片
注意,onStart()方法中添加订阅者。
Filter Event
现在,我们想进行一下过滤,即只发送超过4个字符的文本.
这里写图片描述
Mapping/Transforming Event
RxAndroid热身系列(一)_第8张图片
创建出Username和Email的Observable
RxAndroid热身系列(一)_第9张图片
We map the validity Observable to a color observable and subscribe to them to change the text Color
将有效性的Observable映射为一个颜色的Observable ,并将color发送给subscriber。
RxAndroid热身系列(一)_第10张图片
Branching and Combining Event
Register按钮只有当username和email都满足时才被激活,那么我们需要将之前的两个Observable组合成一个。
在OnStart()中添加如下代码:
RxAndroid热身系列(一)_第11张图片
整个事件的pipeline如下:
RxAndroid热身系列(一)_第12张图片
Improvement
还是有一些可以改进的地方的。
The items from userNameValid, emailValid and registerEnabled are emitted on each user input
每当用户在区域内进行输入时,这些内容都会发送给Subscriber,但其实他们并不需要,他们
只需要在满足条件的临界点知道消息就足够了.
RxAndroid热身系列(一)_第13张图片

作者说,他后面会陆续更新关于Rx多线程处理的相关博客,我会持续关注。

你可能感兴趣的:(android,函数,响应式)