Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

在Android中开始使用RxJava 2

by
Difficulty:BeginnerLength:LongLanguages:

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

如果你是Android开发人员,那么你可能已经听说过RxJava,RxJava是ReactiveX实现的流行开源库,它将响应式编程引入到了Java虚拟机(JVM)。

RxJava的设计是为了摆脱异步数据流的痛苦,而且RxJava对“数据”的定义非常广泛。因为RxJava是一个JVM兼容库,可以在各种平台上使用,在本系列中,我将展示如何使用RxJava 2进行Android开发。

在本系列的最后,你将掌握所有的RxJava 2要素,以便你创建响应式APP,处理各种同步和异步数据,而且实现所有这些功能比使用Java实现更简洁和可管理。

除了给RxJava新手提供介绍,如果你是RxJava 1老手,希望升级到RxJava 2,那么这个系列将有助于使你顺利过渡。虽然升级到最新版本的库可能听起来不是大事,但RxJava 2并不是典型的升级 - 它完全重写了RxJava 1。 这种升级变化太大,初学者很容易困惑,所以需要一些时间来熟悉RxJava 2,而且从长远来看可以节省大量的时间和避免以后的沮丧。

在第一篇文章中,我将介绍什么是RxJava和它为Android开发人员提供的主要优点。我们也将深入了解RxJava项目的核心部件:ObserversObservables和订阅。在本教程结束之前,将创建一个包含所有这些核心组件的“Hello World” APP。 在最后一期中,我们将超越核心的RxJava库并学习RxAndroid,RxAndroid这是一个完整的库,它包含了所有Android特定的扩展,你需要解锁Android响应式编程的全部潜力。

RxJava另一个主要模块是运算符,因此在第二部分中,我将使用运算符转换,组合,过滤和操作APP数据。

在最后一期中,我们将超越核心的RxJava库并学习RxAndroid,RxAndroid这是一个完整的库,它包含了所有Android特定的扩展,你需要解锁Android响应式编程的全部潜力。

我们需要学习很多,所以让我们开始的吧:

什么是RxJava?

RxJava是一个库,可以以响应式编程风格创建APP。其核心是响应式编程,这种编程提供了一种干净,有效的方式来处理和响应实时数据流,包括具有动态值的数据。

这些数据流不一定都采取传统的数据类型形式,RxJava几乎将一切事物看成数据流,从变量到特性,高速缓存,甚至点击和划动这类用户输入事件。

每个被发射的数据流可以是一个值,一个错误或一个“完成的”信号,尽管你不一定要实现最后两个。创建数据发送流之后,将它们与操作和消耗数据的响应式对象组合起来,然后对该数据执行不同的操作。RxJava包括一大堆有用的操作符来处理数据流,诸如过滤,映射,延迟,计数等操作。 RxJava包括一大堆有用的操作符来处理数据流,诸如过滤,映射,延迟,计数等操作。

An Observable and an operation

为了创建数据流的工作流程和响应它们的对象,RxJava继承了Observer软件设计模式。本质上,在RxJava中,你有发射数据流然后终止数据流的Observable对象,以及订阅ObservableObserver对象。 Observer订阅的Observable发射值,错误,或一个完成信号后,Observer会接收到通知。

所以RxJava是关于:

  • 创建Observable
  • Observable一些数据发发射。
  • 创建Observer
  • 分配ObserverObservable
  • Observer接收到Observable发射的数据后,Observer执行任务。

为什么要学习RxJava?

学习任何新技术都需要时间和精力,而作为面向数据的库,RxJava的API并不总是很简单。

为了帮助你决定是否值得学习RxJava,将介绍RxJava库添加到Android项目的主要优点。

更简洁,可读性更强的代码

复杂,冗长和难以阅读的代码总是坏消息。凌乱的代码更容易出现错误和低效,如果发生错误,而你的代码又一团糟,那么你要花费更多的时间追踪错误根源。

即使你的项目确没有错误,代码太复杂也会困扰你 - 通常当你决定在几个月内更新你的APP,启动项目,你立即要面纠结、混乱的代码!

RxJava可以简化处理数据和事件的代码,方法是描述想要实现的内容,而不是为APP编写一份指令列表。RxJava还提供了一个标准工作流程,你可以使用它来处理整个APP中的所有数据和事件 - 创建一个Observable,Observer,把Observable分配给Observer。 这个公式化方法使得非常代码直接和人性化。

使得多线程更易用

如今的Android APP需要能够进行多任务。至少在你APP后台执行某些工作(例如管理网络连接,下载文件或播放音乐)时,用户将能够继续与APP的UI进行交互。 问题是Android默认情况下是单线程的,所以那么你需要创建多线程来执行多任务。

开箱即用,Android确实提供了许多方法来创建其他线程,例如services和IntentServices,但是这些解决方案都不是特别容易实现的,而且代码复杂、冗长和容易出错。

RxJava旨在通过提供特殊的调度程序和操作符来创建多线程Android APP。这些给你简单的方法来指定应该执行工作的线程以及应该发射结果的线程。 RxJava 2.0默认包括一些调度程序,包括Schedulers.newThread,它在创建新线程时特别有用。

要修改执行工作的线程,只需使用subscribeOn运算符更改observer订阅observable的位置。例如,在这里,我们正在创建一个新线程,并指定在这个新线程上执行的工作:

Android中多线程的另一个长期存在的问题是你只能从主线程更新UI。通常,必须创建一个专用的Handler,才能将后台工作的结果发送到APP的UI中。

RxJava有一个更直接的解决方案。可以使用  observeOn运算符指定Observable使用不同的调度程序发送通知,这本质上允许你将Observable的数据发送到选择的线程,包括主UI线程。

这意味着只需两行代码就可以创建一个新的线程,并将此线程上执行的结果发送给Android的主UI线程:

好吧,这里我们作弊了,因为只有在RxAndroid库中才可以使用AndroidSchedulers.mainThread,我们在第三部分中才能看到。不过,这个例子可以让你瞥见RxJava和RxAndroid的力量来简化复杂的Android开发领域。

提高灵活性

Observables以完全隐藏创建数据的方式发射数据。由于的observers甚至无法看到数据的创建方式,你可以随意以任何方式实现Observable

一旦你实现了Observable,RxJava提供了庞大的运算符集合,可以使用它们来过滤,合并和转换由这些Observables 发射的数据。甚至可以将越来越多的操作符连在一起,直到准确创建 了APP所需的数据流。

例如,可以组合来自多个流的数据,过滤新合并的流,然后使用生成的数据作为后续数据流的输入。记住,在RxJava中,几乎所有内容都被看作数据流,因此你甚至可以将这些运算符应用于非传统的“数据”,例如点击事件。

创建高响应APP

在APP中可以通过加载内容页面然后等待用户点击“ 下一步”  按钮的,这种操作已经过时了。现在,典型的移动APP需要能够对日益增长的各种事件和数据做出实时响应。 例如,典型社交网络APP需要不断监听传入的喜好,评论和朋友请求,同时在后台管理网络连接,并在用户点击或滑动屏幕时立即响应。

RxJava库旨在能够同时和实时地管理广泛的数据和事件,使其成为创建高响应APP的强大工具。

将RxJava添加到Android Studio

如果你觉得RxJava确实有益于Android开发,那么成为引入RxJava的第一步就是添加依赖库。

使用你选择的设置创建一个新的Android Studio项目,然后打开module级的build.gradle文件,并添加最新版本的io.reactivex.rxjava2:rxjava依赖关系。

 在撰写本文时,RxJava 2.0.5是最新版本,所以我的build.gradle文件如下所示:

出现提示时,点击立即同步

接下来,打开MainActivity文件并添加RxJava核心功能包:

如果你正在从RxJava 1迁移过来,那么这些导入可能不是你期望的,因为RxJava 1使用完全不同的包名称( 确切地说是rx)。

但是,这不是一个随意更改名称:不同的包名称可以让你在同一个项目中并行使用RxJava 1和RxJava 2。你可以在使用RxJava 1的项目中途添加RxJava 2库并立即开始使用新功能,而不必中断任何RxJava 1代码。

如果你开始使用RxJava2,那么请注意,如果你遇到任何RxJava教程或使用rx程序包名称的代码,那么这是RxJava 1代码,并且不太可能与版本2库兼容。

RxJava的构建块

到目前为止,我们只是在很高的层次上看过RxJava。现在是时候具体深入了解在RxJava工作期间再次出现的两个最重要的组件:ObserversObservables。

在本节结束之前,你不仅可以对这两个核心组件有一个牢固的了解,而且你将创建一个功能齐全的APP,其中包含一个发出数据的Observable和响应数据的Observer

创建一个 Observable

Observable类似于Iterable,对于给定序列,Observable遍历该序列并发射每项,一旦Observer订阅了Observable,Observable就开始发送数据。

每次Observable发射数据时,它会通过该onNext()方法通知Observer。一旦Observable已经发送了所有的值,它终止于:

  • onComplete操作成功时调用。
  • onError抛出Exception调用。

我们来看一个例子。在这里,我们创建Observable,发射数字1234,然后终止。

请注意,在这个例子中,我要解释一些东西,所以不要让代码量减少!这里的代码比Observable在平时的RxJava项目中要多。

创建一个Observer

Observable 使用subscribe()操作符订阅Observers。一旦Observable订阅 Observer,只要Observer发射了如下的内容,Observable就作出响应:

  • onNextObservable已经发射了一个值。
  • onError: 发生了错误。
  • onCompleteObservable发射完了所有的值。

我们创建一个Observer订阅我们的Observable。为了简化起见,这里Observer通过打印一个消息到Android Studio的logcat的监控来响应onNextonErroronComplete

通过从Android Studio窗口的底部选择Android Monitor选项卡(其中光标位于下面的屏幕截图),然后选择Logcat选项卡,打开Android Studio的Logcat监视器。

Reactive Programming Logcat

要运行此代码,请将你的物理Android设备连接到电脑,或者在兼容的AVD上运行APP。只要你的APP出现在屏幕上,你应该看到Observable发出的数据。

Reactive Programming Observer Observable

用较少的代码创建Observable

虽然我们的项目正在成功发射数据,但我们使用的代码并不完全简洁 - 特别是创建Observable的代码。

幸运的是,RxJava提供了一些方便的方法来用更少的创建Observable

1. Observable.just()

可以使用.just()运算符将任何对象转换为ObservableObservable将发出原始对象并完成。

例如,这里我们创建一个Observable将发出一个字符串的所有订阅了Observable的Observers

2. Observable.from()

.from()操作符将对象的集合转换成可观察到的数据流。你可以使用Observable.fromArray将数组转换成Observable,使用Observable.fromCallableCallable转换为Observable,以及使用Observable.fromIterableIterable转换为Observable

3. Observable.range()

可以使用.range()运算符发出多个自然数。你提供的第一个整数是初始值,第二个是您要发出的整数数。例如:

4. Observable.interval()

该运算符创建一个Observable发出无限序列的升序整数,每个发射由你选择的时间隔开。例如:

5. Observable.empty()

empty()创建一个Observable,只发射终止,当你需要快速创建一个测试的Observable时有用。

结论

在本文中,我们学习了RxJava的基础知识。

现在,你知道了如何创建和使用ObserversObservables,以及如何订阅,这样Observables就可以开始发射数据。我们还简要地探索了一些操作符,可以让你用较少的代码创建一系列不同的Observables

但是,操作符不仅仅是减少代码量的方便之选!创建一个Observer和一个Observable本身很简单,但操作符才是RxJava真正的魅力所在。

所以在下一篇文章中,我们将研究RxJava中强大的运算符,其中包括可以在Android上实现多线程流畅体验的操作符。请继续关注RxJava的真正魅力。

与此同时,请阅读Envato Tuts +上的关于Android开发的其他文章和课程!

Observable的数据流图来自ReactiveX文档,由知识共享署名3.0许可协议授权。

Envato qr branded
关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.