前言

最近经常看到RxJava这个字眼,也看到很多人在博客中推荐使用RxJava。好奇的我怎么能错过,于是Google了一下,说RxJava好用的和说RxJava难用的都有,于是自己也亲自尝试了一下(感觉不容易上手)。写博客记录下学习的过程,一方面作为巩固,另一方面希望能帮助到初学者。
(第一篇只介绍了RxJava的基本用法,暂时还无法看出RxJava的优势。切莫着急,随着慢慢深入就能体会到RxJava带来的方便了)

参考:给 Android 开发者的 RxJava 详解
(本文部分内容引用自该博客)

介绍

在GitHub主页上的介绍:

a library for composing asynchronous and event-based programs using observable sequences for the Java VM

翻译过来就是:

一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库

对于新手们来说这个太抽象了,我们(我也是新手)需要看到看到一个更加具体的解释,简单来说,它就是一个实现异步操作的库。(还是不懂?看代码更实在)

优点

RxJava的好处就在于它的简洁性,逻辑简单的时候看不出RxJava的优势,想必大家都知道在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。这时候RxJava的优势就来了,随着程序逻辑变得越来越复杂,它依然能够保持简洁。

观察者模式

首先要先介绍一下观察者模式(可能比喻的不够恰当,意思到了就好);

  • 观察者:监视着被观察者的行为,当被观察者某个状态改变的时候会通知观察者,观察者会执行对应的操作;
  • 被观察者:被监视的对象,当某个状态改变的时候会通知观察者;
  • 订阅(或注册):将观察者和被观察者建立联系。
    (很乱?来个栗子?)

这里举一个我个常用的例子,点击Button后触发OnClickListener
中的onClick()事件。在这个事件中他们的角色分别如下:

  • 观察者:OnClickListener;
  • 被观察者:Button;
  • 订阅(或注册):setOnClickListener()。

RxJava

在上面介绍了观察者模式,这里也将RxJava中的三个角色进行一下角色分配

  • 观察者:Observer;
  • 被观察者:Observable;
  • 订阅(或注册):subscribe()。

  • 观察者
    Observer 即观察者,它决定事件触发的时候将有怎样的行为。
    RxJava 观察者的事件回调方法除了普通事件onNext()(相当于onClick()/onEvent())之外,还定义了两个特殊的事件:onCompleted()和onError()。

    • onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的onNext()发出时,需要触发onCompleted()方法作为标志。
    • onError(): 事件队列异常。在事件处理过程中出异常时,onError()
      会被触发,同时队列自动终止,不允许再有事件发出。
    • 在一个正确运行的事件序列中,onCompleted()和onError()有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted()
      和onError()二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。
  • 被观察者
    Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。可以使用create()、just(T...)、from(T[])或from(Iterable<? extends T>)来创建一个 Observable ,并为它定义事件触发规则。
  • 订阅
    创建了Observable和Observer之后,再用subscribe()方法将它们联结起来

直接看代码吧,这里只展示了RxJava的基本用法,暂时看不出RxJava的优势。

使用

例:打印机个字符串
添加依赖

compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
                //使用Observable.create()创建被观察者
Observable mObservable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
e.onNext("Hello");
e.onNext("World");
e.onComplete();
}
}); //创建一个观察者
Observer mObserver = new Observer() {
@Override
public void onSubscribe(Disposable d) {
//这是新加入的方法,在订阅后发送数据之前,
//回首先调用这个方法,而Disposable可用于取消订阅 } @Override
public void onNext(Object o) { } @Override
public void onError(Throwable e) { } @Override
public void onComplete() { }
};
//订阅
mObservable.subscribe(mObserver);

以上用到的都是rx包里面的,别用到java.util包下的去了!!!

Observer

上面完成了一次Rxjava的基本使用。

扩展

  • Subscriber
    除了Observer接口之外,RxJava 还内置了一个实现了Observer的抽象:Subscriber。Subscriber对Observer接口进行了一些扩展,但他们的基本使用方式是完全一样的:

 Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onSubscribe(Subscription s) {
Log.d(TAG, "onSubscribe: ");
} @Override
public void onNext(String s) {
Log.d(TAG, "Item: " + s);
} @Override
public void onError(Throwable t) {
Log.d(TAG, "onError: ");
} @Override
public void onComplete() {
Log.d(TAG, "onComplete: ");
}
};

不仅基本使用方式一样,实质上,在 RxJava 的 subscribe 过程中,Observer也总是会先被转换成一个Subscriber再使用。如图:

Rxjava源码

所以如果你只想使用基本功能,选择Observer和Subscriber是完全一样的。它们的区别对于使用者来说主要有两点:

  • onStart(): 这是Subscriber增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行),onStart()就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用doOnSubscribe()方法,具体可以在后面的文中看到。
  • unsubscribe(): 这是Subscriber所实现的另一个接口Subscription
    的方法,用于取消订阅。在这个方法被调用后,Subscriber将不再接收事件。一般在这个方法调用前,可以使用isUnsubscribed()先判断一下状态。unsubscribe()这个方法很重要,因为在subscribe()之后,Observable会持有Subscriber的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如onPause()onStop()等方法中)调用unsubscribe()来解除引用关系,以避免内存泄露的发生。
  • Observable
    Observable的其他几种创建方法,一下Observable等价于之前使用Create()创建的Observable:
    1、使用Observable.just()创建被观察者

    Observable observable2 = Observable.just("Hello", "World");

    2、使用Observable.from()创建被观察者

    String [] words = {"Hello", "World"};
    Observable observable3 = Observable.from(words);

    List<String> list = new ArrayList<String>();
    list.add("Hellow");
    list.add("Wrold");
    Observable observable4 = Observable.from(list);

小结

目前没看出RxJava的任何好处,感觉代码还多了~~~
(别急,因为是第一篇,我只介绍了他们之间的关系以及最基础的用法。后面的几篇我会介绍RxJava的其他功能,还有一些复杂的嵌套关系的处理,到时候知道RxJava的强大之处了)

【Android】RxJava的使用(一)基本用法的更多相关文章

  1. Android RxJava 2 的用法 just 、from、map、subscribe、flatmap、Flowable、Function、Consumer ...【转】

    先简单说说RxJava的用途与价值 原文出处:Android RxJava 2 的用法 用途: 异步 (也就是开线程跳转) 价值: 面对复杂的逻辑,它依然 简洁 ,代码 易读 RxJava2 与 Rx ...

  2. Android控件RecyclerView的基本用法

    Android控件RecyclerView的基本用法 转 https://www.jianshu.com/p/e71a4b73098f   github: https://github.com/Cym ...

  3. Android:res之layer-list的用法

    layer-list可以将多个图片按照顺序层叠起来,让其看起来像一个图一样.  和    叠加为: 用法: 在在drawable下建立一个xml文件,faceleft.xml <?xml ver ...

  4. android:windowSoftInputMode及其他部分属性用法

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 今天我们来讲讲android:windoSoftInputMode的用法,许多同学会为软键盘的弹出. ...

  5. Android(java)学习笔记264:Android下的属性动画高级用法(Property Animation)

    1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画 ...

  6. Android命令行工具logcat详细用法!

    logcat是Android中一个命令行工具,可以用于得到程序的log信息. 见板凳详细说明!     本贴内容来自网络,引用网址为:http://hi.baidu.com/%C9%C1%D2%AB% ...

  7. Android网络开发之Volley--Volley基本用法ImageRequest(三)

    1.ImageRequest用法和StringRequest一样,主要分为3步: (1).实例化一个RequestQueue对象 (2).设置ImageRequest对象参数,并将ImageReque ...

  8. Android网络开发之Volley--Volley基本用法JsonObjectReques(二)

    1.JsonObjectRequest用法 用法和StringRequest基本相同,主要分为3步: (1).实例化一个RequestQueue对象 (2).设置JsonObjectRequest对象 ...

  9. Android网络开发之Volley--Volley基本用法StringRequest(一)

    1.StringRequest用法 主要分为3步: (1).实例化一个RequestQueue对象 (2).设置StringRequest对象参数,并将StringRequest对象加入Request ...

  10. 深入Android RxJava 2

    这篇文章是根据Jake Wharton在GOTO CopenHagen 2016上的讲话整理的. 下一个版本(2.0)的RxJava还在开发中.虽然observable.订阅管理和背压(backpre ...

随机推荐

  1. 《Head First 设计模式》读书笔记

    目录 <Head First 设计模式>读书笔记 创建模式 结构模式 行为模式 用思维导图记录的读书笔记. <Head First 设计模式>读书笔记 模式的分类遵循<设 ...

  2. 移植C/C++代码的十个技巧

    这篇文章是我翻译自Top 10 tips for code porting c/c++的一篇小短文,以下是翻译全文,如有错误请留言或查阅原文. 代码的可移植性基本上是指使得源代码能够在不同的平台上编译 ...

  3. Java之IO(二)BufferedInputStream和BufferedOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/6971234.html 1.前言 本文主要介绍输入输出流中的BufferedInputStream和Buffere ...

  4. java泛型---通配符,泛型嵌套

    package generic; import java.util.ArrayList; import java.util.List; /** * ? -->通配符,类型不确定,用于声明 变量| ...

  5. 【树】Count Complete Tree Nodes

    题目: 求完全二叉树节点数. 思路: 满二叉树的节点数是2^k-1,k是树的深度. 所以我们可以先判断该树是否为满二叉树,然后是的话直接返回结果,如果不是递归地求解子树. 这样不用遍历所有的节点.复杂 ...

  6. win7使用命令

    osk 屏幕键盘 perfmon 性能监视器 PresentationSettings 演示设置 recdisc.exe 创建系统恢复光盘 regedt32 注册表编辑器 rekeywiz 加密文件系 ...

  7. [BZOJ 5074]小B的数字

    Description 题库链接 给你一个长度为 \(n\) 的序列 \(a_1,a_2,\cdots,a_n\) ,让你生成另一个序列 \(b_1,b_2,\cdots,b_n\) ,使得 \(\f ...

  8. 三种数据库访问——原生JDBC

    原生的JDBC编程主要分一下几个步骤: (原生的JDBC编程指,仅应用java.sql包下的接口和数据库驱动类编程,而不借助任何框架) 1. 加载JDBC驱动程序: 2. 负责管理JDBC驱动程序的类 ...

  9. autofac使用Common Serivce Locator跟随wcf,mvc,web api的实例控制

    autofac本身只提供了基本的ioc容器的功能 要想在mvc,wcf,web api中使用,除了autofac本身,还需要引入对应的包(点击对应连接可查看文档) 除此之外,使用Common Serv ...

  10. ASP.NET Core2,通过反射批量注入程序集

    public void ConfigureServices(IServiceCollection services)        {            string strValue = Con ...