今天,简单讲讲android里如何使用RxJava(RxAndroid)。

Android框架系列:

一.android EventBus的简单使用

二.android Glide简单使用

三.android OKHttp的基本使用详解

四.android RxJava(RxAndroid)的简单使用

可能大家听都没有听说过这个框架,但是现在其实已经很火了。在面试时,很多公司要求面试者会使用这个库,所以在网上查找资料,学习了如何使用,这里记录一下。

前言

  RxAndroid是RxJava在Android上的一个扩展,大牛JakeWharton的项目。据说和Retorfit、OkHttp组合起来使用,效果不是一般的好。而且用它似乎可以完全替代eventBus和OTTO,这么牛的东西当然要研究研究了 ,看看它到底有多厉害。

正文

相关资源

  RxJava的GitHub地址:https://github.com/ReactiveX/RxJava
  RxAndroid的GitHub地址:https://github.com/ReactiveX/RxAndroid
  中文文档:https://mcxiaoke.gitbooks.io/rxdocs/content/
  一篇写的比较好的入门RxJava的文章的地址:http://gank.io/post/560e15be2dca930e00da1083

1.RxJava是干嘛的

  Rx(Reactive Extensions)是一个库,用来处理事件和异步任务,在很多语言上都有实现,RxJava是Rx在Java上的实现。简单来说,RxJava就是处理异步的一个库,最基本是基于观察者模式来实现的。通过Obserable和Observer的机制,实现所谓响应式的编程体验。
  Android的童鞋都知道,处理异步事件,现有的AsyncTask、Handler,不错的第三方事件总线EventBus、OTTO等等都可以处理。并且大部分童鞋应该都很熟练了。而且经我目前的学习来看,RxJava这个库,上手确实有门槛,不是拿来就能用。但是作为一个猿,那些可能出现的优秀的框架技术,及时的跟进和学习是必要的,从中汲取营养才能帮助自己成长。况且有童鞋已经表示,它完全可以替代EventBus和OTTO,来看看吧。

2.RxJava的优势

  最概括的两个字:简洁。而且当业务越繁琐越复杂时这一点就越显出优势——它能够保持简洁。
  简单的demo看不出来,真正投入项目使用了应该就有体会了。它提供的各种功能强悍的操作符真的很强大。

至于RxAndroid其实只是RxJava的一个扩展,它在RxJava的基础上添加了一些针对Android系统的新API。因为我是在Android系统上编写代码测试,所以我就将之称呼为RxAndroid了。其实大多讲得基本上都是RxJava的知识点。这点需要大家注意。

如果需要在开发中用到RxAndroid,那么需要在
Android Studio中添加依赖
build.gradle中的

dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'io.reactivex:rxandroid:1.2.1'// Because RxAndroid releases are few and far between, it is recommended you also// explicitly depend on RxJava's latest version for bug fixes and new features.compile 'io.reactivex:rxjava:1.1.6'}

Observable,Subscribers

开发的人都知道监听者模式,订阅模式这些概念。而Observable和Subscribers的英文意思就是如此。我们大概也知道差不多和监听者模式差不多。

  • Observable事件源,被观察者。
  • Subcriblers 观察者,事件订阅者
  • Observer 同Subcribler差不多
  • subscribe() 方法,绑定Observable与Subcribler或者Observabler

很显然,Observable对象发生动静,然后通信Subcribers,然后Subcribers实现自己的业务逻辑。

Observable的创建

Observable

它没有一个public的构造器,看源码可知它创建的对象的方法原型如下:

public final static <T> Observable<T> create(OnSubscribe<T> f) {return new Observable<T>(hook.onCreate(f));}

可以看见,它是静态方法,接受一个OnSubscribe的参数,我们先不管它是什么,我们一步一步来,先创建一个对象再说。

Observable<String> mObservable = Observable.create(new Observable.OnSubscribe<String>() {@Overridepublic void call(Subscriber<? super String> subscriber) {}});

当然除了create方法外,还有just()和from()方法也可以创建Observable对象,在这里我们先不管,先从最简单的学起。

Subscriber的创建

创建比较简单

Subscriber<String> mTestSubscriber = new Subscriber<String>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(String s) {}};

要注意的是Subsriber是订阅者,它和subscribe不一样,后者是一个订阅关系动作,将Observable与Subscriber绑定起来。

Observer的创建

Observer<String> mTestObsever = new Observer<String>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(String s) {}};

可以看到Subscriber和Observer很相似。

而实际上Observer是一个接口,而Subscriber是它的一个抽象实现类。源码如下:

public interface Observer<T> {}public abstract class Subscriber<T> implements Observer<T>, Subscription {}

Obersevable与Subscriber的关联

大家已经知道怎么创建Obeservable与Subscriber了,那么它们怎么联系起来的呢?答案是subsribe方法。

 mObservable.subscribe(mTestSubscriber);

这里有一点迷惑性,一般来说正确的写法似乎是这样

mTestSubscriber.subscribe(mObservable);

但RxJava中Api就是如此设计,应该自有它的道理,只是给初学者造成的迷惑,我们需要注意一下。
但这里我想起当初张孝祥老师的面向对象的视频中说过,人把门打开关闭。代码怎么写?

    person.openDoor();person.closeDoor();

还是

    door.open();door.close();

张老师说是后者,具体哪个对象拥有改变自身属性的方法,这个方法就应该在哪个对象上。这样的好处应该在并发环境下更明显。
比如一个电话,很多人抢着打。

class Phone{public synchronized call(){}}

当调用Phone.call()的时候,如果有人占用,其他人自然要等待。但如果要设计成person.callPhone()的时候,问题就没有这么好办了。

好了,扯远了。

回到主题,强调一下

联系被观察者与观察者是通过subscribe()方法

Demo实例

接下来验证的时候到了。写了一个Demo,很简单。
点击一个按钮,然后弹出一个Toast.这中间的流程就是应用了本文的内容。
效果如下:

代码如下:
xml文件很简单,就是一个简单的布局里面有一个按钮。

MainActivity.java

流程如下:
1. 创建Obsersevable对象与Subscriber对象。
2. 按钮点击时通过mObservable.subscribe(mTestSubscriber)方法去触发Obsersevable中的OnSubscribe中的call()方法。
3. 在call方法中会调用subscriber的onNext()方法,而这里的subsriber就是mTestSubscriber。
4. mTestSubscriber在onNext()方法中处理接收到的字符串,然后进行处理,这里是弹出Toast.

需要注意的是,当call()中subscriber处理完所有的事件后,需要发送onCompleted()或者onError()方法来终结此次任务

简单讲讲,这个写的RxJava内容比较浅,但是入门足够了,基本是参考网上一位博客大神的。我这里总结一下:就是先创建Observable事件源,然后Subcriblers 观察者或者Observer,然后在时间发生时事件源调用subscribe() 方法通知观察者,这样就完成了事件的监听。注意事件完成后要发送subscriber.onCompleted();结束事件。

我学习这个时写的Demo:源码下载

android RxJava(RxAndroid)的简单使用就讲完了。

就这么简单。

android RxJava(RxAndroid)的简单使用相关推荐

  1. Android 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器aaa

    MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播 ...

  2. 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器

    MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播 ...

  3. android novate乱码,Android RxJava+Retrofit2+RxBinding

    Android RxJava+Retrofit2+RxBinding 本文原创,转载请注明出处.欢迎关注我的 简书. 安利一波我写的开发框架:MyScFrame喜欢的话就给个Star 前言: 之前写了 ...

  4. Android RxJava应用:优雅实现网络请求轮询(无条件)

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:轮询需求 ...

  5. GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    本文转载于:https://github.com/Freelander/Android_Data/blob/master/Android-Librarys-Top-100.md 本项目主要对目前 Gi ...

  6. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  7. android 多个绑定事件,Android RxJava 实际应用讲解:联合判断多个事件

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. Github截图 RxJava如此受欢迎的原因,在于其提供了丰富 & ...

  8. RxJava/RxAndroid:timer(long delay, TimeUnit unit)

    RxJava/RxAndroid:timer(long delay, TimeUnit unit) timer起到定时器的作用,本例使用timer延迟3秒执行一个输出任务: package com.e ...

  9. RxJava Rxandroid 结合 Retrofit 使用

    其实Retrofit会了.集合RxJava,RxAndroid 就很简单了. 只需要改几个地方. 1.接口里面返回的对象不再是 call,而是Observable public interface A ...

最新文章

  1. 利用脚本生成GUID
  2. Xeno Tactic 2
  3. 前NASA工程师让钢琴开口说英文,还能自弹世界上最难曲目,快到冒烟
  4. 自己挖的坑自己填--docker创建实例出现Waiting for SSH to be available…
  5. 关于script的放置位置
  6. coredata 数据库升级
  7. eof怎么结束输入_SimRobot算法社第二次活动圆满结束啦!
  8. java 文本编辑器 源码_java文本编辑器源码
  9. 前端学习(3183):ant-design的button介绍按钮属性
  10. 【CodeForces - 1082B】Vova and Trophies (贪心模拟,暴力)
  11. WordPress插件-Erphp Weixin Scan关注微信公众号一键登录网站
  12. Python图像处理库PIL的ImageStat模块介绍
  13. paping使用来测试联通网站由于tcp协议导致的无法通信问题超时问题
  14. 在Windows 7 (SP1)上安装Visual Studio 2015
  15. Lucene开发(一):快速入门
  16. XCode使用自带SVN,SVN命令
  17. web前端 基于html实现花店购物网站源码(HTML+CSS+JavaScript) 企业网站制作
  18. 男生学计算机会计,男生学习会计专业好吗
  19. Java判断字符串中是否包含中英文标点符号
  20. 解决pgAdmin4启动失败方法

热门文章

  1. vmware的3种网络模式
  2. MongoDB安装步骤
  3. Http怎么处理长连接
  4. 用matlab交互式的选取图像特定区域数据
  5. Unity3D 中的程序后台运行
  6. Requests方法 -- Token获取操作
  7. step1.day11 C语言基础练习之指针和二级指针
  8. 正负值地处理以及添加回调函数小案例
  9. HDU 1317 XYZZY(floyd+bellman_ford判环)
  10. 挺个性的jQuery返回底部、返回顶部特效