前言

最近经常看到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. 使用git时出现Please make sure you have the correct access rights and the repository exists.问题已解决。

    使用git时,出现Please make sure you have the correct access rights and the repository exists.问题已解决. 今天我在使用 ...

  2. node 利用http和cheerio编写简易爬虫

    首先cnpm init创建一个package.json 引入cheerio模块 cnpm install --save cheerio 然后开始编写代码 let cheerio = require(' ...

  3. 【LeetCode】502. IPO

    题目 假设 LeetCode 即将开始其 IPO.为了以更高的价格将股票卖给风险投资公司,LeetCode希望在 IPO 之前开展一些项目以增加其资本. 由于资源有限,它只能在 IPO 之前完成最多 ...

  4. POST 请求的 forHTTPHeaderField

    Response Headers(从服务器得到的回复的头) Field name Description Example Status Access-Control-Allow-Origin Spec ...

  5. POJ 1260

    //状态转移方程: F[i] = min{f[k] + (a[k+1]+………+a[i]+10} * p[i]} #include <iostream> #define MAXN 105 ...

  6. python基础笔记之面向对象

    # class Foo:# name="kevin"## def __init__(self,puppy):# self.tomato= 'red'# self.dog = pup ...

  7. php 比较2字符串相似度 百分比

    $n1 = similar_text($str1, $str1); $n2 = similar_text($str2, $str2); $nn = similar_text($str1, $str2) ...

  8. Android 开发工具类 25_getJSON

    获取 JSON 数据并解析 import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; im ...

  9. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  10. ssh 登录进入 docker container

    1.Container安装ssh服务,博主的linux是centos ① 安装ssh sudo yum install openssh-server #安装ssh服务器 service sshd st ...