RXJAVA从入门到精通

RxJava是一个基于事件流的实现异步操作的框架(库),其作用是实现异步操作,类似于Android中的AsyncTask,那么为什么RxJava可以在众多异步操作的库中脱颖而出深受广大开发者喜爱呢?原因在于其逻辑简单、使用方便、条理清晰的特点,本文将由浅至深、由易到难一步一步带你理解和使用RxJava。

本文目录如下:

RxJava原理初探

既然RxJava是为了异任务而引入的,那么我们首先引入一个生活中异步任务的小例子:假设小王周末要出去逛街,她出门以后用滴滴打车App叫了一个顺风车,然后顺风车主接到滴滴打车App派发的任务后开车去接小王,最后小王等到车,然后去开心的逛街之旅,整个事件的流程是这样的:

那么将上述例子抽象到代码层面,RxJava实现上述场景的原理是这样的,首先将一个完整的异步任务分为以下几个角色:

  1. 被观察者(Observable):作用是在合适的事件产生事件,在此处的实例中就是小王
  2. 观察者(Observer):接收事件,对事件进行处理,此处的实例中就是司机,处理事件的过程就是开车去接小王
  3. 订阅者(Subscribe):连接观察者与被观察者,在此实例中就是滴滴打车App,任务是将被观察者(小王)的事件请求(打车)发送到观察者(司机)处
  4. 事件(Event):具体的异步任务的载体,在此实例中指的就是打车

这样进行抽象的话我们就可以将上述实例的过程抽象为以下流程:

需要注意的一点是,被观察者可以连续发出多条事件请求给观察者,在此处由于实例限制只发送了一条事件(打车事件),但是在实际的应用场景中被观察者可以发送多条事件给观察者进行处理。总结一下RxJava的简要原理如下图所示:

从上图中我们应该明确:

  1. RxJava其实就是帮我们实现了一个更易用的观察者模式
  2. 被观察者可以发送给观察者多个事件,这也是RxJava被称为基于事件流的库的原因
  3. 观察者会顺序处理观察者接收到的事件

至此,我们就理清了RxJava的大概原理和理念,接下来我们来看看如何使用RxJava实现我们上述的实例。

RxJava入门使用

在使用之前请大家要先在自己的项目中添加RxJava的依赖:

dependencies {
 implementation "io.reactivex.rxjava2:rxjava:2.2.10"
 ...
}

具体的实现我们分为两部分,第一部分是分步实现,旨在向大家说明RxJava的原理、让大家对RxJava的原理有更加深入的认识,第二部分是我们平时在生产中建议使用的、比较简洁的写法,需要注意的是这两部分都能实现相同的功能,大家根据自己的喜好在实际生产中选择对应方法即可。

分步实现

分布实现主要分为3步:

  1. 创建被观察者并且生产事件
  2. 创建观察者并监听事件
  3. 通过订阅将观察者和被观察者连接起来

创建被观察者并且生产事件

代码与注释齐飞更容易理解:

注意3点:

  1. 被观察者用来发送时间的发射器ObservableEmitter实现了Emitter接口,Emitter接口的源码如下(注意看注释):

  1. 请大家注意看注释,也就是说,被观察者可以发送三类事件:普通事件(Next事件)、异常事件(Error事件)、完结事件(Complete事件),普通事件就是我们一般需要发送给观察者处理的异步任务,异常事件一般是指当被观察者发现发生了某些异常时通知观察者所用的,完结事件的作用就是通知观察者所有时间已经发送完毕,相当于一个句号。
  2. Observable是一个泛型抽象类,此处我们实例化的是Observable<String>,但是在实际使用时我们可以使用任意类型,比如Observable<Integer>甚至你自己创建的自定义类;
  3. 在我们的实例中被观察者(小王)只打了一次车,即发送一次事件,但是为了说明RxJava事件流的特点,我这里发送了两次事件即打车事件1和打车事件2,大家不要奇怪;

创建观察者并监听事件

直接看代码,注意注释:

注意2点:

  1. 在观察者接收被观察者的事件(建立连接)之前,默认会先调用一次onSubscribe()方法
  2. 被观察者发送的普通事件(Next事件)、异常事件(Error事件)、完结事件(Complete事件)会依次被这的onNext()、onError()、onComplete()方法接收

通过订阅将观察者和被观察者连接起来

这一步比较简单:

直接调用被观察者(小王)的订阅方法(subscribe()),将观察者(司机)传入即可。

实际的运行效果如下:

基于事件流的链式调用

上一节的分步实现旨在向大家说明RxJava的原理,本节我将为大家介绍一种更加简洁的写法,即与事件流的链式调用法:

实际的运行效果如下:

可以看到,两种写法都可以达到相同的效果,但是很明显第二种写法更加简洁、条理更加清晰,更重要的是,随着程序逻辑的复杂性提高,它依然能够保持简洁和优雅。所以,一般建议使用这种基于事件流的链式调用方式实现RxJava。

如何切断观察者与被观察者之间的连接

有的时候我们可能需要在接收到某个事件之后切断观察者与被观察者之间的联系,这个时候就可以使用Disposable.dispose() 方法,比如:

运行结果如下:

可以看到,当使用Disposable.dispose() 将观察者与被观察者之间的连接切断后,后序的所有被观察者发送的事件都不会被观察者接收(不管是Next事件还是Error事件还是Complete事件),但是被观察者可以正常发送事件。

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android从入门到精通是一个较为庞大的话题,无法在短时间内详细覆盖所有内容。不过,我可以给你提供一个大致的学习路径和一些重要的主题,帮助你入门并逐步提升技能。 1. Java基础:Android开发主要使用Java语言,所以你需要对Java有一定的了解。学习Java的基本语法、面向对象编程、异常处理等。 2. Android基础知识:学习Android的核心组件,包括Activity、Fragment、Intent等,了解Android应用的生命周期和各个组件之间的交互。 3. 布局和视图:学习如何使用XML文件创建Android应用的界面布局,以及如何使用不同类型的视图(View)来构建用户界面。 4. 用户交互:学习如何处理用户的输入事件,包括点击按钮、滑动手势等。了解如何使用Toast、Dialog、Snackbar等来向用户显示信息。 5. 数据存储:学习如何使用SQLite数据库进行数据的持久化存储,以及如何使用SharedPreferences进行简单的数据存储。 6. 网络通信:学习如何使用HTTP协议发送和接收网络请求,以及如何解析JSON数据。了解常见的网络通信库,如OkHttp、Retrofit等。 7. 多媒体处理:学习如何使用Android提供的API来处理图片、音频和视频。了解如何使用Camera API进行拍照和录像。 8. 性能优化:学习如何优化Android应用的性能,包括减少内存占用、优化布局、优化网络请求等方面。 9. 安全性和权限管理:学习如何保护Android应用的数据安全,并了解如何处理用户权限请求和权限管理。 10. 第三方库和框架:学习如何使用常用的第三方库和框架来加快开发速度,如Glide、ButterKnife、Dagger等。 11. Material Design:学习如何使用Material Design风格来设计美观的用户界面,并了解Material Design的设计原则和组件。 12. 进阶主题:学习更高级的Android开发主题,如响应式编程(RxJava)、MVVM架构、测试和调试技巧等。 以上是一个大致的学习路径,你可以根据自己的兴趣和需求来选择深入学习的内容。同时,不断实践和项目开发也是提升技能的重要方式。希望这些信息对你有所帮助!如果你还有其他问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值