一篇RxJava友好的文章(一)
转载请标明出处:
http://blog.csdn.net/forezp/article/details/52886700
本文出自方志朋的博客
Rxjava在目前的开发中已经是如火如荼,非常的流行,唯一的就是上手不太容易,学习成本高,学习rxjava有一段时间了,也看了老罗的rxjava视频,决定自己总结下。
另外欢迎star我的另一个项目,瓣呀,一个基于豆瓣API模仿网易云音乐的开源app
准备
在android工程中的gradle.build中配置,为了更好的理解,所以导入java8 的lambda 表达式。
compile 'io.reactivex:rxjava:1.2.1'
compile 'io.reactivex:rxandroid:1.2.1'
基础
rxjava 中有两个核心的对象Observable(被观察者,它会发出一系列的事件源)和Subscribers(观察者,接受事件源),Observable发出事件后,中间可以有一系列的操作、变化,可以精确的控制事件,最终被观察者所接收。其中Observable每发出一个事件就会,就会调用他的subscriber 的onext(),直到发生错误onerror()或onComplete()结束。
1.用Observable.create去创建一个Observable对象,并发射一个”hi Rxjava”,就结束。
Observable<String> observable= Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber)
{
subscriber.onNext("hi RxJava");
subscriber.onCompleted();
}});
然后,我们需要去创建一个subscriber去处理observable发射过来的数据。
Subscriber<String> subscriber=new Subscriber<String>() {
@Override
public void onCompleted() {
Log.e(TAG,"onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e(TAG,e.getMessage());
}
@Override
public void onNext(String s) {
Log.e(TAG,s);
}};
最后需要,subscribe函数把observable对象和subscriber对象关联起来,这样就完成了subscriber对observable的订阅。
observable.subscribe(subscriber);
程序运行一下:
可能你觉得这样太复杂了,但是涉及到了与之前不一样的变成思想,即响应式编程。
2.用just去创建observable,just英语意思是仅仅的意思,如果只发出一个事件可以用这种方式。另外在创建Subscriber的时候,如果仅仅关心onNext(),这时可以用Action1这个对象。
Observable.just("hi Rxjava2").subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.e(TAG,s);
}});
运行程序:

3.用from创建observable,这种方式创建,需要传入一个集合,它会一个一个的发射,在subscriber上它会一个一个的接收。
String [] strs={"1","2","3","4"};
Observable.from(Arrays.asList(strs))
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.e(TAG,s);
}});
运行程序:

是不是有点像高级for循环-.- 。
4.操作符map,是用在observable和subcriber中间,是为了操作observable发射的数据,操作之后的数据,会被subcriber 接收。rxjava有很多操作符,map操作符是将一个事件转换为另一个事件的。
Observable.just("hi rxjava")
.map(new Func1<String, String>() {
@Override
public String call(String s) {
return s+" ,你好rxjava";
}})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.e(TAG,s);
}});
运行程序:

另外,map操作符可以将转换类型,比如string 转int .
Observable.just("hi rxjava")
.map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.hashCode();
}})
.subscribe(new Action1<Object>() {
@Override
public void call(Object s) {
Log.e(TAG,s+"");
}});
5.flatmap操作符
flatMap操作符接收一个Observable的输出作为输入,同时输出另外一个Observable。在flatMap操作符中,我们可以做一系列的事情,然后输出的新的Observable,这个Observable是我们在Subscriber想要接收的。
Observable.create(new Observable.OnSubscribe<List<String>>() {
@Override
public void call(Subscriber<? super List<String>> subscriber) {
String [] strs={"1","2","3","4","5","6","7"};
subscriber.onNext(Arrays.asList(strs));
}})
.flatMap(new Func1<List<String>, Observable<?>>() {
@Override
public Observable<?> call(List<String> list) {
return Observable.from(list);
}})
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
Log.e(TAG,o.toString());
}});
首先Observable发出一个list , 然后经过flatmap 将其变成from创建的Observable,这个Observable将list中的元素一个一个的发射,然后,subcriber 中接收。
运行程序:

6.filter 操作符,对Observable发射的数据进行过滤操作,哪有subcriber接收 ,哪些不接收。
Observable.create(new Observable.OnSubscribe<List<String>>() {
@Override
public void call(Subscriber<? super List<String>> subscriber) {
String [] strs={"1","2","3","4","5","6","7"};
subscriber.onNext(Arrays.asList(strs));
}})
.flatMap(new Func1<List<String>, Observable<?>>() {
@Override
public Observable<?> call(List<String> list) {
return Observable.from(list);
}})
.filter(new Func1<Object, Boolean>() {//filter 操作符,去掉“1”;
@Override
public Boolean call(Object o) {
if(o.toString().equals("1"))return false;
return true;
}})
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
Log.e(TAG,o.toString());
}});
运行程序:

7.take操作符,固定返回数量。take(2),返回2个结果。
Observable.create(new Observable.OnSubscribe<List<String>>() {
@Override
public void call(Subscriber<? super List<String>> subscriber) {
String [] strs={"1","2","3","4","5","6","7"};
subscriber.onNext(Arrays.asList(strs));
}})
.flatMap(new Func1<List<String>, Observable<?>>() {
@Override
public Observable<?> call(List<String> list) {
return Observable.from(list);
}})
.filter(new Func1<Object, Boolean>() {//filter 操作符,去掉“1”;
@Override
public Boolean call(Object o) {
if(o.toString().equals("1"))return false;
return true;
}})
.take(2)
.subscribe(new Action1<Object>() {//take 操作符,最多输出的数量
@Override
public void call(Object o) {
Log.e(TAG,o.toString());
}});
运行程序:

rxjava中还有很多操作符,具体见官网文档和中文文档,操作符可以让你对数据流做任何操作。多个操作符配合起来,可以让很复杂的逻辑变得简单,同时,在操作数据的过程中,subcriber并不需要知道中间做了那些操作,只需要知道返回的结果,操作数据也变的简单。
优秀文章推荐:
- 史上最简单的 SpringCloud 教程 | 终章
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 史上最简单的SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)
一篇RxJava友好的文章(一)的更多相关文章
- 一篇RxJava友好的文章(三)
组合操作符 继上一篇讲述了过滤操作符,这一篇讲述组合操作符,组合操作符可用于组合多个Observable.组合操作符相对于过滤操作符要复杂很多,也较难以理解,需要花费时间去看文档查资料,写demo才能 ...
- 一篇RxJava友好的文章(二)
上一篇文章介绍了rxjava的基本用法,和一些常用的操作符,以及rxjava的链式操作带来的好处.由于rxjava非常的强大,让我如此的痴迷,我打算写五篇文章,专门讲解rxjava 常见的操作符和用法 ...
- 《转载-两篇很好的文章整合》Android中自定义控件
两篇很好的文章,有相互借鉴的地方,整合到一起收藏 分别转载自:http://blog.csdn.net/xu_fu/article/details/7829721 http://www.cnblogs ...
- (转)干货|这篇TensorFlow实例教程文章告诉你GANs为何引爆机器学习?(附源码)
干货|这篇TensorFlow实例教程文章告诉你GANs为何引爆机器学习?(附源码) 该博客来源自:https://mp.weixin.qq.com/s?__biz=MzA4NzE1NzYyMw==& ...
- 给B公司的一些建议(又一篇烂尾的文章)
感慨:太多太多的悲伤故事,发生在自己身上,发生在自己的身边.因此,为了避免总是走"弯路",走"错误"的道路,最近一直在完善自己的理论模型. 烂尾说明:本文是一篇 ...
- 小鹏汽车技术中台实践 :微服务篇 InfoQ 今天 以下文章来源于InfoQ Pro
小鹏汽车技术中台实践 :微服务篇 InfoQ 今天 以下文章来源于InfoQ Pro
- 一篇SSM框架整合友好的文章(一)
转载请标明出处: http://blog.csdn.net/forezp/article/details/53730333 本文出自方志朋的博客 最近实在太忙,之前写的<rxjava系列文章&g ...
- 一篇SSM框架整合友好的文章(二)
上一篇讲述了DAO 层,mybatis实现数据库的连接,DAO层接口设计,以及mybtis和spring的整合.DAO层采用接口设计方式实现,接口和SQL实现的分离,方便维护.DAO层所负责的仅仅是接 ...
- 一篇SSM框架整合友好的文章(三)
###一.SpringMVC理论 它始终是围绕 handler. 数据模型 model. 页面view进行开发的. 运行流程图: 通过mvc配置文件,配置"中央处理器"dispat ...
随机推荐
- 卸载3DSMAX
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- (转)Shell脚本编程--Uniq命令
uniq 原文:http://blog.csdn.net/xifeijian/article/details/9209627 uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用 ...
- Unity C# 用枚举(enum)制作复选框
最近在项目中做测试脚本用到一些布尔值做方法的开关,突然想到可以制作一个复选框控制开关. 首先搜集网上的资料,基本大同小异,这里就不多做解释了,代码附上: public class EnumFlagsA ...
- ES增删改查入门1
1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful接口URL的格式: http://localhost:9200/ ...
- php中配置伪静态
mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.下面我详细说说它的使用方法 1.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查 ...
- Java基础入门 - 三种注释及文档注释详解
类似C/C++,Java也支持单行和多行注释 注释中的字符在编译时会被忽略 注释通常为类.变量和方法的主要描述 单行注释 // 注释内容 多行注释 /* 注释内容 */ /* * 注释内容 */ 文档 ...
- 1.字符串池化(intern)机制及拓展学习
1.字符串intern机制 用了这么久的python,时刻和字符串打交道,直到遇到下面的情况: a = "hello" b = "hello" print(a ...
- eclipse 构建从 SVN 上下载的可识别的 maven 项目
从 SVN 上下载的 maven 项目中含有父项目,属于 maven 的嵌套,每个子项目和父项目虽有 pom.xml 文件,在结构上也是 maven 然而并不是 eclipse 识别的 maven 项 ...
- window下隐藏apache版本和PHP脚本等敏感信息
隐藏Apache信息 1.1 主配置中启用httpd-default.conf 文件: conf/httpd.Conf 找到httpd-default.conf,删除前面的注释“#”,改成如下 Inc ...
- 转:解决Arcsde用户锁定的问题
采用arcgis平台做GIS应用的人,可能偶尔碰到sde用户锁定(Arccatalog 或应用程序异常退出的时比较多)的问题,往往咱们解决的办法是重启sde服务.如果一个服务器上有多个连接时,重启服务 ...