本文主要是介绍(十六) 试着使用RxJava,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言: 看了RxJava的Readme和一些关于RxJava的博客,对RxJava有些简单地了解了,开始练个手熟悉一下,练手过程中发现由于RxJava版本迭代,参考博客中给的例子已经不能直接用了,说明这种第三方库的使用还是有风险的。
参考博客:给 Android 开发者的 RxJava 详解
基于RxJava版本:2.1.12
demo地址:点击打开链接
1. RxJava基础知识
RxJava正如Readme所述,“它扩展了观察者模式以支持数据/事件序列,并添加了运算符,使您可以从对低级线程,同步,线程安全性和并发数据结构等事物中抽身,改为可以声明性地组合序列。”
首先它是扩展了观察者模式。
观察者模式分为4个关键部分:
Observable
(可观察者,即被观察者)、 Observer
(观察者)、 subscribe
(订阅)、事件。
RxJava的使用也和这4个关键部分分不开的,下面结合例子分析对应代码扮演的角色。
2. 结合例子看观察者模式(待修缮)
我参考前文提及博客的例子发现会报错,有些接口已经不能用了,所以瞎调用一通,反正按正常观察者模式写应该没错。
RxJava其实看例子就能很好地分清楚Observable和Observer,可以类比button.setOnClickListener(new OnClickListener())。
如上图所述Observale订阅了Observer,事件到来以后会回调Observer声明的的回调方法,不是很清楚RxJava中什么扮演了事件的角色,button例子中事件是指点击事件,当监控到点击事件后,就会回调onClick方法。
上面的例子执行结果如下:
如上所示貌似可以从例子中看到各API调用顺序,其实只有Observer的onSubscribe和ObservableOnSubscribe subscribe是确定的,onNext和onComplete不确定的,因为我写在了ObservableOnSubscribe subscribe中,按理说来onNext和onComplete是事件触发后会回调的,而不是即刻调用。所以这个例子有点问题。
当去掉ObservableOnSubscribe subscribe中调用onNext和onComplete后这两个方法就不被调用了。
3. 加上Schedulers的例子
----------参考begin(有删减)----------
在RxJava 中,Scheduler
——调度器,相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程。RxJava 已经内置了几个 Scheduler
,它们已经适合大多数的使用场景:
Schedulers.newThread()
: 总是启用新线程,并在新线程执行操作。Schedulers.io()
: I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的Scheduler
。行为模式和newThread()
差不多,区别在于io()
的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下io()
比newThread()
更有效率。不要把计算工作放在io()
中,可以避免创建不必要的线程。Schedulers.computation()
: 计算所使用的Scheduler
。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个Scheduler
使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在computation()
中,否则 I/O 操作的等待时间会浪费 CPU。- 另外, Android 还有一个专用的
AndroidSchedulers.mainThread()
,它指定的操作将在 Android 主线程运行。
有了这几个 Scheduler
,就可以使用 subscribeOn()
和 observeOn()
两个方法来对线程进行控制了。* subscribeOn()
: 指定 subscribe()
所发生的线程,即 Observable.OnSubscribe
被激活时所处的线程。或者叫做事件产生的线程。* observeOn()
: 指定 Subscriber
所运行在的线程。或者叫做事件消费的线程。
----------参考end----------
补充:
Schedulers.trampoline():返回一个默认共享的Scheduler,在一个参与的线程中以先进先出的顺序装载和执行任务。
Schedulers.single():返回一个默认共享的支持单例的Scheduler,用于需要在同一后台进程中顺序执行的任务
这上面说的还是可以用的,改造下代码:
或者玩玩其他的:
又或者
哈,Observer的onSubscribe总是在主进程被调用了,这也意味着那个方法里不能放耗时操作了。
待续。。。(对应参考博客 4. 变换)
这篇关于(十六) 试着使用RxJava的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!