RxJava + Retrofit最佳实践

900次阅读  |  发布于4年以前

本文将记录RxJava和Retrofit在app中的简单使用,不一定是所谓的“最佳实践”,项目代码地址https://github.com/AlbertLiu-Breeze/RxWithRetrofit,欢迎pr

什么是RxJava

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

RxJava的作用是使得在页面组件逻辑复杂和业务逻辑复杂的情况下,让你依然能够比较清晰地维护和改进代码,这一点在工程上至关重要。作者现在在开发一款定制ROM的搭载Android系统的收银机,由于屏幕尺寸比较大,页面上真是百花齐放,业务逻辑相当冗长,加之之前的历史维护不完善,代码读起来真是欲仙欲死,目前已经使用RxJava + Retrofit重构了部分页面,目前来看效果比较好。本文暂不深究RxJava的底层实现逻辑,单纯从应用层面来看一下如何使用这个库。

Talk is cheap,show me the code!

先来看一段“常规”代码

功能可以通过代码读出来,如果刚刚接手代码,需要添加额外的业务逻辑,代码就会一直无规律膨胀下去,

使用RxJava之后的代码

代码的实现和Builder模式的代码样式非常相似,能够比较直观地看出中间的业务逻辑,维护起来应该非常容易。

这里要解释一下,RxJava的异步实现,是通过一种扩展的观察者模式来实现的。

RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。

与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext() (相当于 onClick() / onEvent())之外,还定义了两个特殊的事件:onCompleted() 和 onError()。

RxJava的线程调度

在RxJava 中,Scheduler ——调度器,相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程。RxJava 已经内置了几个 Scheduler ,它们已经适合大多数的使用场景:

有了这几个 Scheduler ,就可以使用 subscribeOn() 和 observeOn() 两个方法来对线程进行控制了。 * subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。 * observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。

接下来开始在我们的app中使用RxJava

我们的app很简单,点击页面上的一个按钮,调用接口,并将接口的返回数据打印出来。

参数ProgressSubscriber是我们自定义的一个订阅者,这个类的主要作用是在开始的时候显示一个loading,同时在网络请求结束的时候关闭loading显示,当然,也可以在这里添加其他的业务逻辑。我们同时定义了一个订阅者的基础类,在这个基础类里面统一处理监听到的网络请求的错误

HttpMethods是我们定义的一个实际进行网络请求的网路路由,如果想要统一项目中所有的网络请求头,可以定义一个最基础的网络请求路由来实现

RxJava有很多内置的API可以轻松实现数据处理来满足你的业务,just、repeat、defer等都是常用的一些API,在我们的实例app中,目前只是简单使用了几个函数,RxJava的使用范围不仅局限在网络请求当中。对于复杂UI和业务逻辑来讲,最简洁的方案就是找出核心的被观察者,然后各个订阅者实现自己的监听逻辑。

有时间的话,建议大家去下载《RxJavaEssentials》的原版电子书,Let your app fly !

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8