转载请标明出处:

http://blog.csdn.net/forezp/article/details/52886700

本文出自方志朋的博客

Rxjava在目前的开发中已经是如火如荼,非常的流行,唯一的就是上手不太容易,学习成本高,学习rxjava有一段时间了,也看了老罗的rxjava视频,决定自己总结下。

另外欢迎star我的另一个项目,瓣呀,一个基于豆瓣API模仿网易云音乐的开源app

准备

在android工程中的gradle.build中配置,为了更好的理解,所以导入java8 的lambda 表达式。

  1. compile 'io.reactivex:rxjava:1.2.1'
  2. compile 'io.reactivex:rxandroid:1.2.1'

基础

rxjava 中有两个核心的对象Observable(被观察者,它会发出一系列的事件源)和Subscribers(观察者,接受事件源),Observable发出事件后,中间可以有一系列的操作、变化,可以精确的控制事件,最终被观察者所接收。其中Observable每发出一个事件就会,就会调用他的subscriber 的onext(),直到发生错误onerror()或onComplete()结束。

1.用Observable.create去创建一个Observable对象,并发射一个”hi Rxjava”,就结束。

  1. Observable<String> observable= Observable.create(
  2. new Observable.OnSubscribe<String>() {
  3. @Override
  4. public void call(Subscriber<? super String> subscriber)
  5. {
  6. subscriber.onNext("hi RxJava");
  7. subscriber.onCompleted();
  8. }});

然后,我们需要去创建一个subscriber去处理observable发射过来的数据。

  1. Subscriber<String> subscriber=new Subscriber<String>() {
  2. @Override
  3. public void onCompleted() {
  4. Log.e(TAG,"onCompleted");
  5. }
  6. @Override
  7. public void onError(Throwable e) {
  8. Log.e(TAG,e.getMessage());
  9. }
  10. @Override
  11. public void onNext(String s) {
  12. Log.e(TAG,s);
  13. }};

最后需要,subscribe函数把observable对象和subscriber对象关联起来,这样就完成了subscriber对observable的订阅。

  1. observable.subscribe(subscriber);

程序运行一下:



可能你觉得这样太复杂了,但是涉及到了与之前不一样的变成思想,即响应式编程。

2.用just去创建observable,just英语意思是仅仅的意思,如果只发出一个事件可以用这种方式。另外在创建Subscriber的时候,如果仅仅关心onNext(),这时可以用Action1这个对象。

  1. Observable.just("hi Rxjava2").subscribe(new Action1<String>() {
  2. @Override
  3. public void call(String s) {
  4. Log.e(TAG,s);
  5. }});

运行程序:

3.用from创建observable,这种方式创建,需要传入一个集合,它会一个一个的发射,在subscriber上它会一个一个的接收。

  1. String [] strs={"1","2","3","4"};
  2. Observable.from(Arrays.asList(strs))
  3. .subscribe(new Action1<String>() {
  4. @Override
  5. public void call(String s) {
  6. Log.e(TAG,s);
  7. }});

运行程序:

是不是有点像高级for循环-.- 。

4.操作符map,是用在observable和subcriber中间,是为了操作observable发射的数据,操作之后的数据,会被subcriber 接收。rxjava有很多操作符,map操作符是将一个事件转换为另一个事件的。

  1. Observable.just("hi rxjava")
  2. .map(new Func1<String, String>() {
  3. @Override
  4. public String call(String s) {
  5. return s+" ,你好rxjava";
  6. }})
  7. .subscribe(new Action1<String>() {
  8. @Override
  9. public void call(String s) {
  10. Log.e(TAG,s);
  11. }});

运行程序:

另外,map操作符可以将转换类型,比如string 转int .

  1. Observable.just("hi rxjava")
  2. .map(new Func1<String, Integer>() {
  3. @Override
  4. public Integer call(String s) {
  5. return s.hashCode();
  6. }})
  7. .subscribe(new Action1<Object>() {
  8. @Override
  9. public void call(Object s) {
  10. Log.e(TAG,s+"");
  11. }});

5.flatmap操作符

flatMap操作符接收一个Observable的输出作为输入,同时输出另外一个Observable。在flatMap操作符中,我们可以做一系列的事情,然后输出的新的Observable,这个Observable是我们在Subscriber想要接收的。

  1. Observable.create(new Observable.OnSubscribe<List<String>>() {
  2. @Override
  3. public void call(Subscriber<? super List<String>> subscriber) {
  4. String [] strs={"1","2","3","4","5","6","7"};
  5. subscriber.onNext(Arrays.asList(strs));
  6. }})
  7. .flatMap(new Func1<List<String>, Observable<?>>() {
  8. @Override
  9. public Observable<?> call(List<String> list) {
  10. return Observable.from(list);
  11. }})
  12. .subscribe(new Action1<Object>() {
  13. @Override
  14. public void call(Object o) {
  15. Log.e(TAG,o.toString());
  16. }});

首先Observable发出一个list , 然后经过flatmap 将其变成from创建的Observable,这个Observable将list中的元素一个一个的发射,然后,subcriber 中接收。

运行程序:

6.filter 操作符,对Observable发射的数据进行过滤操作,哪有subcriber接收 ,哪些不接收。

  1. Observable.create(new Observable.OnSubscribe<List<String>>() {
  2. @Override
  3. public void call(Subscriber<? super List<String>> subscriber) {
  4. String [] strs={"1","2","3","4","5","6","7"};
  5. subscriber.onNext(Arrays.asList(strs));
  6. }})
  7. .flatMap(new Func1<List<String>, Observable<?>>() {
  8. @Override
  9. public Observable<?> call(List<String> list) {
  10. return Observable.from(list);
  11. }})
  12. .filter(new Func1<Object, Boolean>() {//filter 操作符,去掉“1”;
  13. @Override
  14. public Boolean call(Object o) {
  15. if(o.toString().equals("1"))return false;
  16. return true;
  17. }})
  18. .subscribe(new Action1<Object>() {
  19. @Override
  20. public void call(Object o) {
  21. Log.e(TAG,o.toString());
  22. }});

运行程序:

7.take操作符,固定返回数量。take(2),返回2个结果。

  1. Observable.create(new Observable.OnSubscribe<List<String>>() {
  2. @Override
  3. public void call(Subscriber<? super List<String>> subscriber) {
  4. String [] strs={"1","2","3","4","5","6","7"};
  5. subscriber.onNext(Arrays.asList(strs));
  6. }})
  7. .flatMap(new Func1<List<String>, Observable<?>>() {
  8. @Override
  9. public Observable<?> call(List<String> list) {
  10. return Observable.from(list);
  11. }})
  12. .filter(new Func1<Object, Boolean>() {//filter 操作符,去掉“1”;
  13. @Override
  14. public Boolean call(Object o) {
  15. if(o.toString().equals("1"))return false;
  16. return true;
  17. }})
  18. .take(2)
  19. .subscribe(new Action1<Object>() {//take 操作符,最多输出的数量
  20. @Override
  21. public void call(Object o) {
  22. Log.e(TAG,o.toString());
  23. }});

运行程序:

rxjava中还有很多操作符,具体见官网文档中文文档,操作符可以让你对数据流做任何操作。多个操作符配合起来,可以让很复杂的逻辑变得简单,同时,在操作数据的过程中,subcriber并不需要知道中间做了那些操作,只需要知道返回的结果,操作数据也变的简单。

源码下载

优秀文章推荐:

一篇RxJava友好的文章(一)的更多相关文章

  1. 一篇RxJava友好的文章(三)

    组合操作符 继上一篇讲述了过滤操作符,这一篇讲述组合操作符,组合操作符可用于组合多个Observable.组合操作符相对于过滤操作符要复杂很多,也较难以理解,需要花费时间去看文档查资料,写demo才能 ...

  2. 一篇RxJava友好的文章(二)

    上一篇文章介绍了rxjava的基本用法,和一些常用的操作符,以及rxjava的链式操作带来的好处.由于rxjava非常的强大,让我如此的痴迷,我打算写五篇文章,专门讲解rxjava 常见的操作符和用法 ...

  3. 《转载-两篇很好的文章整合》Android中自定义控件

    两篇很好的文章,有相互借鉴的地方,整合到一起收藏 分别转载自:http://blog.csdn.net/xu_fu/article/details/7829721 http://www.cnblogs ...

  4. (转)干货|这篇TensorFlow实例教程文章告诉你GANs为何引爆机器学习?(附源码)

    干货|这篇TensorFlow实例教程文章告诉你GANs为何引爆机器学习?(附源码) 该博客来源自:https://mp.weixin.qq.com/s?__biz=MzA4NzE1NzYyMw==& ...

  5. 给B公司的一些建议(又一篇烂尾的文章)

    感慨:太多太多的悲伤故事,发生在自己身上,发生在自己的身边.因此,为了避免总是走"弯路",走"错误"的道路,最近一直在完善自己的理论模型. 烂尾说明:本文是一篇 ...

  6. 小鹏汽车技术中台实践 :微服务篇 InfoQ 今天 以下文章来源于InfoQ Pro

    小鹏汽车技术中台实践 :微服务篇 InfoQ  今天 以下文章来源于InfoQ Pro

  7. 一篇SSM框架整合友好的文章(一)

    转载请标明出处: http://blog.csdn.net/forezp/article/details/53730333 本文出自方志朋的博客 最近实在太忙,之前写的<rxjava系列文章&g ...

  8. 一篇SSM框架整合友好的文章(二)

    上一篇讲述了DAO 层,mybatis实现数据库的连接,DAO层接口设计,以及mybtis和spring的整合.DAO层采用接口设计方式实现,接口和SQL实现的分离,方便维护.DAO层所负责的仅仅是接 ...

  9. 一篇SSM框架整合友好的文章(三)

    ###一.SpringMVC理论 它始终是围绕 handler. 数据模型 model. 页面view进行开发的. 运行流程图: 通过mvc配置文件,配置"中央处理器"dispat ...

随机推荐

  1. 大数据 Big Data howto

    The Fourth Paradigm: Data-Intensive Scientific Discovery http://research.microsoft.com/en-us/collabo ...

  2. oracle 中 Start with...connect by 的用法(递归查询)

    阿里电面问到了相关的知识,在网上找到这方面的文章. 这几个关键字是查询递归数据的,形成一个树状结构.目前只有oracle支持,其他数据都要结合存储过程实现 语法: select * from some ...

  3. webkit技术--网页渲染原理

    Webkit渲染 Webkit 是苹果发起的一个开源项目,后来谷歌用这个项目以 webkit 创建了一个新的项目 Chromium,我们平常用的 Chrome 浏览器一般都是基于 Chromium 开 ...

  4. 工作采坑札记:3. Spark中es-hadoop插件异常解决

    1. Es-Hadoop异常: org.elasticsearch.hadoop.EsHadoopException: Could not write all entries [615/300864] ...

  5. Qt 学习(3)

    Qt 修改 Windows 注册表项 在使用 FT232R 驱动(usb转串口设备)连接电脑时,下位机发送的数据会被转换器缓存起来,由串口转换器驱动设定的延时定时发送到 PC,这样就造成了一个问题:上 ...

  6. 浅析正则表达式模式匹配的 String 方法

    在JavaScript代码中使用正则表达式进行模式匹配经常会用到String对象和RegExp对象的一些方法,例如replace.match.search等方法,以下是对一些方法使用的总结. Stri ...

  7. 报表XtraReport创建是实现

    1.创建XtraReport报表程序 一般设计这个程序是分着的,为了方便我就把他们合到一起 首先创建一个Winform Application 在form1中放一个button,右键程序,添加新项 如 ...

  8. SQL Server 2008 报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误

    今天SqlServer 2008连接数据库时报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误.在连接到 SQL Server 2008 时,在默认的设置下 SQL Server 不允许远程 ...

  9. MotionEvent的getX(),getY()与getRawX(),getRawY()区别

    在Android的View中getX  getRawX获取的坐标是不一样的,只是相对比照的对象不一样而已. 1.在View中: getX()是表示Widget相对于自身左上角的x坐标,而getRawX ...

  10. SpringCloud的学习记录(7)

    这一章节讲zuul的使用. 在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和Artifact等信息, 这里 ...