Android RxJava2学习实践

前言

        其实对于RxJava这个词,我很早就有碰到过,但是被其中各种Observer、Observable、Subscriber、Subscribe等等的搞得云里雾里,所以一直没有去花心思研究理解。

        最近在读公司android开发大佬的框架,发现有用到RxJava,于是想着利用空余的时间来研究一下这个很火的响应式编程框架。因为一些版本兼容性的问题,公司的框架仍使用的是RxJava1,但是我在github上看了看,发现现在的RxJava已是2.1.14,想着长江后浪推前浪的说法,于是决定选择RxJava2来学习实践一下。

        之前有看过一位大神的一篇关于RxJava的详细介绍,链接贴上: 给 Android 开发者的 RxJava 详解,这篇文章中,作者从方方面面介绍了RxJava的设计思想,使用方法,原理等,写得很优秀,看完之后,相信你也会对RxJava有很深的理解。作者在文章中用到的是RxJava1,RxJava1和RxJava2区别还是挺大的,但是设计的思想上基本不变。我这边用的是RxJava2,。

        RxJava是一个基于事件订阅的异步执行的一个类库,其设计模式应该是我们常见的观察者模式。我们在android开发中,常常会对按钮进行如下的操作


        其实这就是一个观察者和被观察者的设计,Button是被观察者,OnClickListener是观察者,两者通过setOnClickListener来实现绑定关系,当Button有被click的动作,就会通知OnClickListener进行onClick里面定义的do something操作。

        在同样是观察者模式的RxJava中,Observable对应Button,Observer对应OnClickListener,subscribe则对应setOnClickListener。将两者进行对比,就可以更直观的去理解RxJava。

我们来实际操作一下。(基于RxJava2)

1、首先我们需要创建一个Observable也就是被观察者


        我们需要输入在观察者和被观察者之间传递参数的类型,这边我们定义我们的参数为String类型。我们可以看到在override方法中有个参数叫emitter,中文翻译为发射器,这个词很形象,因为我们需要用它来发布我们的操作信息,我们主要用到它的以下三个方法


        onNext、OnError、OnComplete,这三个方法是Observer观察者暴露给Observable的三个接口,具体的实现方法会在Observer中定义。


        我们可以用onNext来向Observer发送我们的参数信息,也可以用OnError来向Observer发送报错,onComplete不能传递参数,它会在整个绑定结束后被调用。

2、使Observable订阅(subscribe)一个观察者(Observer)


        这一步其实应该在Observer创建后再进行subscribe,但是鉴于打代码时的顺序,我这边就先码上了,我们下一步要在subscribe后的括号里new一个Observer。

3、创建Observer观察者


        我们创建了红圈中的部分,这就是一个Observer,其中各个override方法,就是定义观察者对于emitter发出的各个消息所作出应答的地方。


        在onNext中对收到的字符串进行log打印,点击运行。


        至此,我们实现了一个对RxJava的简单应用。

        当然这只是为了演示而演示,我们在实际的开发中是怎么可能为了打印一条字符串而去写那么多的代码。在日常的开发中,我们常常会碰到这样一个情景:从网络获取数据,然后将数据展示到界面上。

        上述情景中,我们为了不造成界面的卡顿,不能将从网络获取数据的过程放在主线程中,现在好像已经禁止在主线程进行网络请求了,而获取到数据后,将数据展示到界面上的过程,又必须在主线程中更新界面。对于这种需求我们可以有很多中实现的方式。比如说新开一个线程处理网络请求,拿到数据后,再调用runOnUiThread在主线程中更新UI


        当然也可以使用Thread+handler或是Asynctask等方式来实现,现在我们用RxJava的方式来实现一下。


        代码也很简单,但是你会发现,和之前我们用rxjava来打印log相比,上面的实现多了两行代码


        subscribeOn和observeOn,从字面意思上就可以读出,这两个方法的作用是声明subscribe和observe在那个线程上执行。Schedulers为我们提供了如下的选择,在这里我不一一展开了


       subscribeOn是来设定我们的被观察者的操作是在哪个线程中进行, 一般我们会用到的是Schedulers.io(),这个方法常用于I/O 操作,比如我们从网络请求数据。在这些方法中,其实io()和 newThread() 差不多,都是新开线程来完成操作,区别在于 io() 的内部实现是用一个无数量上限的线程池,可以重用空闲的线程,所以在多数情况下 io() 比 newThread() 更有效率。

        observeOn是来设定我们的观察者的操作是在哪个线程执行,我们用到的是AndroidSchedulers.mainThread(),这个方法在rxjava中是没有的,我们需要在项目中导入rxandroid框架(implementation'io.reactivex.rxjava2:rxandroid:2.0.2')才能使用,AndroidSchedulers.mainThread()声明观察者的操作是在主线程也就是UI线程执行的,所以我们可以在observer中对界面组件进行更新操作。

        对了,在Observer的回调方法中有这样一个方法


        它的作用是在被观察者subscribe观察者的时候,让observer拿到一个Disposable对象,我们可以用这个对象对观察者和被观察者进行解绑的操作,其作用是切断连接,确切地讲是将Observer(观察者)切断,不再接收来自被观察者的事件,而被观察者的事件却仍在继续执行。

        emmm...讲了这些,可能有些朋友会觉得rxjava用起来很繁琐,明明可以用new Thread来解决的事情,偏偏要用啥observable啥observer,我一开始也是那么认为的,但是,用过rxjava之后,真香!


        我们在写new Thread的时候,常常会将代码层层嵌套缩进,一是代码不美观,二是代码读起来也会有困难,再比如说我们用thread+handler的时候,实现代码这边一块那边一块,还要多创建几个成员变量,这也使我们的代码变得臃肿,难看,难以维护。

        而rxjava使用的是链式调用,我们按照代码逻辑顺序实现,先完成啥功能,完成这个功能之后如何响应,一步一步写下去就行,没有代码的缩进,逻辑清楚,为之后代码的维护增加了便捷。

        当然我上面所描述的只是rxjava的很小一部分,它还有很多比如说map、flatmap、Flowable等功能,当你都去了解和使用过之后,你会发现rxjava的强大。

        以上。


猜你喜欢

转载自blog.csdn.net/weixin_42247440/article/details/80598187