RxJava系列教程之介绍篇(一)
来源:互联网 发布:mac office 2016 登录 编辑:程序博客网 时间:2024/05/29 17:11
RxJava系列教程:
RxJava系列教程之介绍篇(一)
RxJava系列教程之创建篇(二)
RxJava系列教程之变换篇(三)
RxJava系列教程之过滤篇(四)
RxJava系列教程之线程篇(五)
序言
RxJava是目前很火的开源框架之一,主要能够让你的代码逻辑变的很清晰,而且使用起来很方便,现在我们就来开始学习这个框架究竟牛逼在什么地方。
介绍之外貌协会
rxjava通过链式操作给人使用方便的感觉,我们来看看一个rxjava的长相:
Observable .just("1","2","3","4") .map(new Func1<String, Integer>() { @Override public Integer call(String str) { return Integer.parseInt(str); } }) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.newThread()) .subscribe(new Action1<Integer>() { @Override public void call(Integer i) { System.out.println("打印结果" + i); } });
嗯?平平无奇,看不出有什么特别的,但是这东西一直点下去貌似又些许牛逼的感觉。有人说,这有什么牛逼的,一直点下去的这种代码我也会写,于是有人写了一个这样的实体类:
public class Student{ private String id; private String name; private String gender; private int age; private String tel; public String getId() { return id; } public Student setId(String id) { this.id = id; return this; } public String getName() { return name; } public Student setName(String name) { this.name = name; return this; } public String getGender() { return gender; } public Student setGender(String gender) { this.gender = gender; return this; } public int getAge() { return age; } public Student setAge(int age) { this.age = age; return this; } public String getTel() { return tel; } public Student setTel(String tel) { this.tel = tel; return this; }}
使用:
new Student() .setId("001") .setName("张三") .setAge(18) .setGender("男") .setTel("110");
但是RxJava会只是那么简单吗[贱笑],我们还是先来看看他的正常介绍。
介绍-观察者模式
上面介绍了他的长相,下面我们来看看他的内在。
我知道我必须先把RxJava的核心东西说出来,观察者模式,可能有小伙伴不是很清楚观察者模式是个什么东西,我先说个概念,就是被观察者的一举一动都在观察者的眼中,但是观察者只观察被观察者的其中一个行为,当被观察者做出了这个行为之后,观察者会做出相应的行为。当然,在此之前,被观察者需要给观察者观察的权利,也就是需要和观察者一个订阅关系。
我来做个比喻,假设有一个灯和一个开关,灯和开关用线连着(订阅关系),当开关被打开的时候,灯也就跟着亮了,就这么一个小小的场景,我们来将观察者模式硬塞进去。
灵魂画师登场!
根据一个东西做出一个行为,另一个东西就会做出另一个行为,我们来对以上2个东西定义,谁是观察者,谁是被观察者。那么结果就很明显了,必须开关是被观察者,灯是观察者,因为灯一直盯着开关,当开关被打开的时候,灯就会亮起来!
使用方式
大家大概明白了rxjava的内在,我们就开始使用吧,至于如何使用,传送门-RxJava,在gradle配置一句话:
compile "io.reactivex.rxjava2:rxjava:2.x.y"
我们继续吧!
首先既然是观察者模式,那么被观察者和观察者一定是要有的了。那么在RxJava中怎么创建一个基本的被观察者呢?
上代码!
// 被观察者Observable<String> observable = Observable.create(new OnSubscribe<String>(){ @Override public void call(Subscriber<? super String> sub) { } });
长的像接口一样的东西出现了!这是什么鬼,等等,话说观察者模式是有点接口回调机制的样子,看来是这样没跑了。不懂接口回调的可以看看这篇文章——一个例子让你彻底理解java接口回调。
回到正题。
这个就是被观察者了,至于里面的这个接口是什么,这大括号里面又该填什么东西,听我细细道来。
首先,这个被观察者本身是不作出任何行为的,也是为了代码的耦合性,我们用里面的Subscriber来做出行为,先不管Subscriber这个是干嘛的,你只需要知道这个东西可以让被观察者表达他的行为就可以了。
Observable<String> observable = Observable.create(new OnSubscribe<String>() { @Override public void call(Subscriber<? super String> sub) { sub.onNext("1"); sub.onNext("2"); sub.onNext("3"); sub.onCompleted(); } });
于是这个被观察者做了4次行为,我们可以看到onNext这个行为做了3次,为了让行为有区别,我们在里面传递了不同的数据,既然被观察者已经行动了,那么观察者也不能闲着,召唤观察者的方式如下:
// 观察者Observer<String> observer = new Observer<String>() { @Override public void onNext(String str) { } @Override public void onError(Throwable e) { } @Override public void onCompleted() { } };
我擦嘞,居然又是接口,还有3个重写方法,等等,第一个onNext()方法有点熟悉啊,没错,被观察者里面我们使用了sub.onNext()这个,被观察者里面我们传进来了一次参数,观察者这里的onNext又给我们了一个String类型的参数,难道。。。
没错!这就是被观察者传给我们的参数,被观察者做了onNext这个行为并传了一个参数后,观察者的onNext方法将会捕获到,并且得到行为的参数。
那么onError和onCompleted有什么用,是这样的,这就相当于一个异常捕获了对不对,你可以在被观察者里面做一个网络异常捕获啊,比如:
Observable<String> observable = Observable.create(new OnSubscribe<String>() { @Override public void call(Subscriber<? super String> sub) { try { URL url = new URL(url); sub.onNext("1"); sub.onNext("2"); sub.onNext("3"); } catch (MalformedURLException e) { sub.onError(e); }finally { sub.onCompleted(); } } });
这样,观察者就知道被观察者什么时候会发生错误的行为了,然后就可以做出相应操作了,在最后调用下onCompleted,完美收官!
先别扯远了,我们来试着打印下被观察者传递给观察者的参数
Observer<String> observer = new Observer<String>() { @Override public void onNext(String str) { System.out.println(str); } @Override public void onError(Throwable e) { } @Override public void onCompleted() { System.out.println("完成!"); } };
那么这两个东西要怎么联系起来,订阅!没错让这2个东西关联起来的方式就是让他们相互关联!
被观察者要赋予观察者观察的权利,所以顺序是代码长这个样子:
// 被观察者订阅观察者observable.subscribe(observer);
运行结果:
123完成!
没错,当被观察者发送完所有的事件后,就会自动调用onCompleted方法,这就像是异常捕获中的finally一样。
看到这里,有看官要吐槽了,这。。有毛用啊!敲那么多代码,就打印个123,浪费老子时间,老子不用这个了,老子走了!
等等,您老先别走,这只是rxjava的基础形态,再多感受一点东西,你就会知道rxjava的强大之处。
总结
rxjava中:
我们从本篇文章能够学习到的东西有:
1.如何创建一个链式设置的实体[偷笑]
2.什么是观察者模式
3.如何创建一个被观察者和观察者
4.如何实现他们之间的订阅关系
注:
被观察者和观察者形成订阅关系后,当被观察者做出onNext的行为时,会让观察者捕获到,观察者也可以做出相应的事情,这里要注意的是,我们所说的行为是指onNext、onError、onCompleted这些行为。
下集预告:本篇我们创建了被观察者,但是这种看这好复杂啊,有没有什么简单点的方式创建呢,答案当然是有的!下篇我们会介绍被观察者的花式创建方法!敬请期待!
- RxJava系列教程之介绍篇(一)
- RxJava系列教程之创建篇(二)
- RxJava系列教程之变换篇(三)
- RxJava系列教程之过滤篇(四)
- RxJava系列教程之线程篇(五)
- RxJava教程(一)
- Bimmer7 Android教程 入门系列之:Manifest介绍(一)
- RxJava系列(一、基础篇)
- rxjava系列(一)-- 初识Rxjava
- Android 单排上王者系列之RxJava基础篇一
- RxJava理解系列(一)
- hexo系列教程:(一)hexo介绍
- Unity3D之NGUI 系列教程(一)
- RxJava 学习之(一)
- Android-PickerView系列之介绍与使用篇(一)
- Android-PickerView系列之介绍与使用篇(一)
- Android-PickerView系列之介绍与使用篇(一)
- RxJava入门系列一,基础篇
- BeanUtils 和 DBUtils
- Tomcat配置
- MIPS汇编:MIPS32中通用寄存器的使用约定
- java 前台使用枚举方法(一)
- Leetcode 138 Copy List with Random Pointer
- RxJava系列教程之介绍篇(一)
- memcached 并发原语CAS与GETS操作
- Windows与自定义USB HID设备通信说明
- 运维基础工作备忘
- IDC:2017年第一季度全球企业存储市场保持平稳
- 【资料合集】2017云栖大会 成都峰会全面回顾:PDF下载+现场视频
- IDE破解方法
- vue初步介绍
- 连接池