RxAndroid 响应式编程 类似于监听-观察者模式

在观察者模式中,你的对象需要实现 RxJava 中的两个关键接口:Observable 和 Observer。当 Observable 的状态改变时,所有的订阅它的 Observer 对象都会被通知。

在 Observable 接口的众多方法中,调用 subscribe() 让 Observer 开始订阅该Observable

从这时起,Observer 接口有三个方法是 Observable 调用时需要的:

  • onNext(T value) 提供了一个新的 T 类型的条目给 Observer
  • onComplete() 通知 ObserverObservable 已发送完条目
  • onError(Throwable e) 通知 ObserverObservable 遇到了一个错误

gradle配置

observable操作大概分为以下几种

1.创建操作

Create — 通过调用观察者的方法从头创建一个Observable
Defer — 在观察者订阅之前不创建这个Observable,为每一个观察者创建一个新的Observable
Empty/Never/Throw — 创建行为受限的特殊Observable
From — 将其它的对象或数据结构转换为Observable
Interval — 创建一个定时发射整数序列的Observable
Just — 将对象或者对象集合转换为一个会发射这些对象的Observable
Range — 创建发射指定范围的整数序列的Observable
Repeat — 创建重复发射特定的数据或数据序列的Observable
Start — 创建发射一个函数的返回值的Observable
Timer — 创建在一个指定的延迟之后发射单个数据的Observable 2.组合操作
And/Then/When — 通过模式(And条件)和计划(Then次序)组合两个或多个Observable发射的数据集
CombineLatest — 当两个Observables中的任何一个发射了一个数据时,通过一个指定的函数组合每个Observable发射的最新数据(一共两个数据),然后发射这个函数的结果
Join — 无论何时,如果一个Observable发射了一个数据项,只要在另一个Observable发射的数据项定义的时间窗口内,就将两个Observable发射的数据合并发射
Merge — 将两个Observable发射的数据组合并成一个
StartWith — 在发射原来的Observable的数据序列之前,先发射一个指定的数据序列或数据项
Switch — 将一个发射Observable序列的Observable转换为这样一个Observable:它逐个发射那些Observable最近发射的数据
Zip — 打包,使用一个指定的函数将多个Observable发射的数据组合在一起,然后将这个函数的结果作为单项数据发射
3.辅助操作(用于处理Observable的操作符)
Delay — 延迟一段时间发射结果数据
Do — 注册一个动作占用一些Observable的生命周期事件,相当于Mock某个操作
Materialize/Dematerialize — 将发射的数据和通知都当做数据发射,或者反过来
ObserveOn — 指定观察者观察Observable的调度程序(工作线程)
Serialize — 强制Observable按次序发射数据并且功能是有效的
Subscribe — 收到Observable发射的数据和通知后执行的操作
SubscribeOn — 指定Observable应该在哪个调度程序上执行
TimeInterval — 将一个Observable转换为发射两个数据之间所耗费时间的Observable
Timeout — 添加超时机制,如果过了指定的一段时间没有发射数据,就发射一个错误通知
Timestamp — 给Observable发射的每个数据项添加一个时间戳
Using — 创建一个只在Observable的生命周期内存在的一次性资源 4.条件和布尔操作(可用于单个或多个数据项,也可用于Observable)
All — 判断Observable发射的所有的数据项是否都满足某个条件
Amb — 给定多个Observable,只让第一个发射数据的Observable发射全部数据
Contains — 判断Observable是否会发射一个指定的数据项
DefaultIfEmpty — 发射来自原始Observable的数据,如果原始Observable没有发射数据,就发射一个默认数据
SequenceEqual — 判断两个Observable是否按相同的数据序列
SkipUntil — 丢弃原始Observable发射的数据,直到第二个Observable发射了一个数据,然后发射原始Observable的剩余数据
SkipWhile — 丢弃原始Observable发射的数据,直到一个特定的条件为假,然后发射原始Observable剩余的数据
TakeUntil — 发射来自原始Observable的数据,直到第二个Observable发射了一个数据或一个通知
TakeWhile — 发射原始Observable的数据,直到一个特定的条件为真,然后跳过剩余的数据 5.错误处理
Catch — 捕获,继续序列操作,将错误替换为正常的数据,从onError通知中恢复
Retry — 重试,如果Observable发射了一个错误通知,重新订阅它,期待它正常终止

简单用法

匹配字符串过滤

        final List<String> data = new ArrayList<String>() ;
data.add("a");
data.add("ac");
data.add("acccc");
data.add("a3ddcc");
data.add("bnbbc");
data.add("9if"); RxTextView .textChanges(et_name)
.debounce(500 , TimeUnit.MILLISECONDS)
.map(new Function<CharSequence, String>() {
@Override
public String apply(CharSequence charSequence) throws Exception {
return charSequence.toString();
}
})
.observeOn(Schedulers.io())
// .filter(new Predicate<String>() {
// @Override
// public boolean test(String s) throws Exception {
// return false;
// }
// })
.map(new Function<String, List<String>>() {
@Override
public List<String> apply(String s) throws Exception {
List<String> dataList = new ArrayList<String>() ;
if ( !TextUtils.isEmpty(s)){
//通过key s去过滤list集合
for(String bean : data){
if(bean.contains(s)){
dataList.add(bean);
}
}
}
return dataList;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<String>>() {
@Override
public void accept(List<String> strings) throws Exception {
Log.e("LM" , "符合的数据个数 " + (strings == null ? 0 : strings.size()));
}
});
上面的例子就是通过key去过滤list 最后打印出来符合数据的个数。 RxAndroid更好的实现了主/子线程之间的切换,上面的例子我们可以看到subscribeOn()指定向subscribe()动作发生的线程。observeOn()指定观察者得到通知回调时的线程。

AndroidSchedulers.mainThread()//主线程

Schedulers.immediate()//当前线程立马执行

Schedulers.newThread()//每次创建新线程运行代码

Scheduler.io()//执行IO操作,或者是网络访问耗时但不耗费CPU的操作

Schedulers.computation() //执行图形计算等复杂计算


最后 讲一个表单校验的例子,我们很多情况下会有这种场景,一个页面需要用户输入很多信息,刚开始按钮不可点击,当每项信息都输入了之后 按钮变成可点击的状态。这种情况我们一般会想到监听每个输入框的输入
事件,比较麻烦,我们可以通过observable去实现它,如下:
比如有三项准备要输入的内容
InitialValueObservable<CharSequence> observableName = RxTextView.textChanges(et_name);
InitialValueObservable<CharSequence> observablePhone = RxTextView.textChanges(et_phone);
InitialValueObservable<CharSequence> observablePwd = RxTextView.textChanges(et_pwd);
List<InitialValueObservable<CharSequence>> observableList = new ArrayList<>();
observableList.add(observableName);
observableList.add(observablePhone);
observableList.add(observablePwd);
Observable.combineLatest(observableList, new Function<Object[], Boolean>() {

    @Override
public Boolean apply(Object[] objects) throws Exception {
for (Object o : objects){
if(TextUtils.isEmpty((CharSequence) o)){
return false;
}
}
return true;
}
}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Boolean>() {
@Override
public void onSubscribe(Disposable d) { } @Override
public void onNext(Boolean aBoolean) {
if(aBoolean){
btn.setEnabled(true);
}else{
btn.setEnabled(false);
}
} @Override
public void onError(Throwable e) { } @Override
public void onComplete() { }
});
代码很清晰,通过apply方法的返回值 会判断按钮是否可以点击。未完待续...
 
 

RxAndroid中observable的基本使用和表单校验操作的更多相关文章

  1. Element-ui中为上传组件添加表单校验

    vue所依赖的Element的UI库在使用其中的upload组件时,可能很大几率会遇到这个题,需要给upload组件添加表单校验 大家这里直接看代码就可以 <el-form-item class ...

  2. 应用二:Vue之ElementUI Form表单校验

    (注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的)   表单校验是前端开发过程中最常用到的功能之一,根据个人的工作经验总结在此对表单校验功能的基 ...

  3. Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  4. JQuery中内容操作函数、validation表单校验

    JQuery:内容体拼接(可以直接拼接元素节点和内容节点) JQuery实现: 方案1:A.append(B); == B.appendTo(A);A的后面拼接B 方案2: A.prepend(B); ...

  5. 利用jquery.validate以及bootstrap的tooltip开发气泡式的表单校验组件

    表单校验是页面开发中非常常见的一类需求,相信每个前端开发人员都有这方面的经验.网上有很多成熟的表单校验框架,虽然按照它们默认的设计,用起来没有多大的问题,但是在实际工作中,表单校验有可能有比较复杂的个 ...

  6. AngularJS 1.2.x 学习笔记(表单校验篇)

    https://my.oschina.net/cokolin/blog/526911 摘要: 本文首发于 blog.csdn.net/vipshop_ebs/article/details/39472 ...

  7. js 节点 document html css 表单节点操作

    js 节点 document html css 表单节点操作 节点操作:访问.属性.创建 (1)节点的访问:firstChild.lastChild.childNodes.parentChild(父子 ...

  8. angularJs表单校验(超级详细!!!)

    html代码 <!DOCTYPE html> <html ng-app="angularFormCheckModule"> <head> < ...

  9. bootstrap+jQuery.validate表单校验

    谈谈表单校验 这大概是一种惯例,学习前台后台最开始接触的业务都是用户注册和登录.现在社会坚持以人为本的理念,在网站开发过程同样如此.User是我们面对较多的对象,也是较核心的对象.最开始的用户注册和登 ...

随机推荐

  1. 使用element ui 日期选择器获取值后的格式问题

    一般情况下,我们需要给后台的时间格式是: "yyyy-MM-dd" 但是使用Element ui日期选择器获取的值是这样的: Fri Sep :: GMT+ (中国标准时间) 在官 ...

  2. js 作用域,作用域链,闭包

    什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...

  3. XMLHttpRequest2 异步 ajax

    XMLHttpRequest1只是对已经存在的xhr对象细节进行规范定义, XMLHttpRequest2升级了该对象.   FormData 类型可以用在xhr传输的时候,把表单序列化或者将数据以表 ...

  4. float 浮动

    浮动最开始的目的是为了让文字环绕图片(一个图片和多行文字对齐)   1.包裹性:元素添加 float 属性之后 自动变成 inline-block 元素,能设置 宽高 2.破坏性:破坏自身高度,还会使 ...

  5. 【Tesseract】Tesseract API在VS 2013中的配置以及调用

    想要在VS中使用Tesseract库,必须使用经过相对应的VS版本编译过的dll以及lib.比如在VS 2013中,就必须使用在VS 2013中编译过的Tesseract库. 这里我给出经过VS 20 ...

  6. mapreduce解析执行sql流程

    样例准备 编号 姓名 性别 班级编号 1 name_1 male 1 2 name_2 female 2 3 name_3 male 3 4 name_4 female 4 5 name_5 male ...

  7. java Log4j日志配置详解大全

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  8. C#的XML文件的读取与写入

    在设计程序的时候,对于一些变化性较强的数据,可以保存在XML文件中,以方便用户修改.尤其是对于一些软硬件的配置文件,很多都选择了用XML文件来存取.XML文件简单易用,而且可以在任何应用程序中读写数据 ...

  9. DbContext 和ObjectContext

    近日学习新知识,用到CallContext数据槽,一直使用ObjectContext 但同时又在学习EF CodeFirst,上下文定义使用的 DbContext 这时问题来了,如何把DbContex ...

  10. Android Oreo 8.0 新特性实战 Autosizing TextView --自动缩放TextView

    Android Oreo 8.0 新特性实战 Autosizing TextView --自动缩放TextView 8.0出来很久了,这个新特性已经用了很久了,但是一直没有亲自去试试.这几天新的需求来 ...