资讯专栏INFORMATION COLUMN

【Android】RxJava的使用(一)基本用法

用户83 / 3293人阅读

摘要:第一篇只介绍了的基本用法,暂时还无法看出的优势。不仅把每个事件多带带处理,还会把它们看做一个队列。在事件处理过程中出异常时,会被触发,同时队列自动终止,不允许再有事件发出。可以使用或来创建一个,并为它定义事件触发规则。

前言

最近经常看到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)来创建一个 Observable ,并为它定义事件触发规则。

订阅

创建了Observable和Observer之后,再用subscribe()方法将它们联结起来

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

使用

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

compile "io.reactivex:rxjava:1.0.14"
compile "io.reactivex:rxandroid:1.0.1"
        //创建一个观察者
        Observer observer = new Observer() {

            @Override
            public void onCompleted() {
                Log.i(TAG, "Completed");
            }

            @Override
            public void onError(Throwable e) {
                Log.i(TAG, "Error");
            }

            @Override
            public void onNext(String s) {
                Log.i(TAG, s);
            }
        };
        //使用Observable.create()创建被观察者
        Observable observable1 = Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber subscriber) {
                subscriber.onNext("Hello");
                subscriber.onNext("Wrold");
                subscriber.onCompleted();
            }
        });
        //订阅
        observable1.subscribe(observer);
以上用到的都是rx包里面的,别用错了!!!

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

扩展

Subscriber

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

Subscriber subscriber = new Subscriber() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
};

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

所以如果你只想使用基本功能,选择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 list = new ArrayList();
list.add("Hellow");
list.add("Wrold");
Observable observable4 = Observable.from(list);
小结

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

更多:
Android RxJava的使用(二)Action
Android RxJava的使用(三)转换(map、flatMap)
Android RxJava的使用(四)线程控制 —— Scheduler

以上有错误之处感谢指出

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73384.html

相关文章

  • AndroidRxJava使用基本用法

    摘要:第一篇只介绍了的基本用法,暂时还无法看出的优势。不仅把每个事件单独处理,还会把它们看做一个队列。在事件处理过程中出异常时,会被触发,同时队列自动终止,不允许再有事件发出。可以使用或来创建一个,并为它定义事件触发规则。 前言 最近经常看到RxJava这个字眼,也看到很多人在博客中推荐使用RxJava。好奇的我怎么能错过,于是Google了一下,说RxJava好用的和说RxJava难用的都...

    siberiawolf 评论0 收藏0
  • AndroidRxJava使用(三)转换——map、flatMap

    摘要:前两篇的使用一基本用法的使用二介绍了的基本用法,对还不了解的请先看以上两篇。这篇为大家讲解中和的使用。注意对这些发射的数据做的是合并操作,因此它们可能是交错的。如果要保证顺的的话,可以使用。其他操作符除了和之外,还有其他操作符以供使用。 前两篇Android RxJava的使用(一)基本用法、Android RxJava的使用(二)Action介绍了RxJava的基本用法,对Rxjav...

    Jackwoo 评论0 收藏0
  • AndroidRxJava使用(三)转换——map、flatMap

    摘要:前两篇的使用一基本用法的使用二介绍了的基本用法,对还不了解的请先看以上两篇。这篇为大家讲解中和的使用。注意对这些发射的数据做的是合并操作,因此它们可能是交错的。如果要保证顺的的话,可以使用。其他操作符除了和之外,还有其他操作符以供使用。 前两篇Android RxJava的使用(一)基本用法、Android RxJava的使用(二)Action介绍了RxJava的基本用法,对Rxjav...

    caozhijian 评论0 收藏0
  • AndroidRxJava使用(二)Action

    摘要:回顾在上一节的使用一基本用法中,介绍了的基本用法。它同样只有一个方法,这个方法也无返回值,但有一个参数与同理,由于和也是单参数无返回值的,因此可以将和打包起来传入以实现不完整定义的回调的使用定义三个对象,分别打包。 回顾 在上一节Android RxJava的使用(一)基本用法中,介绍了RxJava的基本用法。下面来回顾下实现一次RxJava的基本使用。例:分别打印Hello、 Wor...

    2501207950 评论0 收藏0
  • AndroidRxJava使用(二)Action

    摘要:回顾在上一节的使用一基本用法中,介绍了的基本用法。它同样只有一个方法,这个方法也无返回值,但有一个参数与同理,由于和也是单参数无返回值的,因此可以将和打包起来传入以实现不完整定义的回调的使用定义三个对象,分别打包。 回顾 在上一节Android RxJava的使用(一)基本用法中,介绍了RxJava的基本用法。下面来回顾下实现一次RxJava的基本使用。例:分别打印Hello、 Wor...

    jemygraw 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<