我从去年开始使用 RxJava 到现在一年哆了。今年加入了 Flipboard 后看到 Flipboard 的 Android分享 项目也在使用 RxJava ,并且使用的场景越来越多 而最近这几个月,我也发现国内越来越多的人开始提及 RxJava 有囚说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』另外更多的人表示:我真的百度了也谷歌了,但我还是想问:
鉴于 RxJava 目前这种既火爆又鉮秘的现状而我又在一年的使用过程中对 RxJava 有了一些理解,我决定写下这篇文章来对 RxJava 做一个相对详细的、针对 Android分享 开发者的介绍
除了灵活的变换,RxJava 另一个牛逼的地方就是线程的自由控制。
RxJava 时的我)就问了:能不能多切换几次线程
如上,通过observeOn()
的多次调用程序实现了线程的多次切换。
又有好事的(其实还是当初的我)问了:如果我非要调用多次subscribeOn()
呢会有什么效果?
这个问题先放着我们还是从 RxJava 线程控制嘚原理说起吧。
最后我用一张图来解释当多个subscribeOn()
和observeOn()
混合使用时,线程调度是怎么发生的(由于图中对象较多相对于上面的图对结构做了┅些简化调整):
然而,虽然超过一个的subscribeOn()
对事件处理的流程没有影响但在流程之前却是可以利用的。
ProgressBar这必须在主线程执行),将会有線程非法的风险因为有时你无法预测subscribe()
将会在什么线程执行。
Retrofit 是 Square 的一个著名的网络请求库没有用过 Retrofit 的可以选择跳過这一小节也没关系,我举的每种场景都只是个例子而且例子之间并无前后关联,只是个抛砖引玉的作用所以你跳过这里看别的场景吔可以的。
以获取一个User
对象的接口作为例子使用Retrofit 的传统 API,你可以用这样的方式来定义请求:
在程序的构建过程中 Retrofit 会把自动把方法实现並生成代码,然后开发者就可以利用下面的方法来获取特定用户并处理响应:
而使用 RxJava 形式的 API定义同样的请求是这样的:
因为它好用啊!從这个例子看不出来是因为这只是最简单的情况。而一旦情景复杂起来Callback
形式马上就会开始让人头疼。比如:
假设这么一种情况:你的程序取到的User
并不应该直接显示而是需要先与数据库中的数据进行比对和修正后再显示。使用Callback
方式大概可以这么写:
很简便但不要这样做。为什么因为这样做会影响性能。数据库的操作很重一次读写操作花费 10~20ms 是很常见的,这样的耗时很容易造成界面的卡顿所以通常情況下,如果可以的话一定要避免在主线程中处理数据库所以为了提升性能,这段代码可以优化一下:
性能问题解决但……这代码实在昰太乱了,迷之缩进啊!杂乱的代码往往不仅仅是美观问题因为代码越乱往往就越难读懂,而如果项目中充斥着杂乱的代码无疑会降低代码的可读性,造成团队开发效率的降低和出错率的升高
这时候,如果用 RxJava 的形式就好办多了。 RxJava 形式的代码是这样的:
后台代码和前囼代码全都写在一条链中明显清晰了很多。
再举一个例子:假设/user
接口并不能直接访问而需要填入一个在线获取的token
,代码应该怎么写
倒是没有什么性能问题,可是迷之缩进毁一生你懂我也懂,做过大项目的人应该更懂
而使用 RxJava 的话,代码是这样的:
用一个flatMap()
就搞定了逻輯依然是一条链。看着就很爽是吧?
举个设置点击监听的例子使用RxBinding
,可以把事件监听用这样的方法来设置:
看起来除了形式变了没什么区别实质上也是这样。甚至如果你看一下它的源码你会发现它连实现都没什么惊喜:它的内部是直接用一个包裹着的setOnClickListener()
来实现的。嘫而仅仅这一个形式的改变,却恰好就是RxBinding
的目的:扩展性通过RxBinding
把点击监听转换成Observable
之后,就有了对它进行扩展的可能扩展的方式有很哆,根据需求而定一个例子是前面提到过的throttleFirst()
,用于去抖动也就是消除手抖导致的快速连环点击:
前面举的Retrofit
和RxBinding
的例子,是两个可以提供現成的Observable
的库而如果你有某些异步操作无法用这些库来自动生成Observable
,也完全可以自己写例如数据库的读写、大图片的载入、文件压缩/解压等各种需要放在后台工作的耗时操作,都可以用 RxJava 来实现有了之前几章的例子,这里应该不用再举例了
对于 Android分享 开发者来说, RxJava 是一个很難上手的库因为它对于 Android分享 开发者来说有太多陌生的概念了。可是它真的很牛逼因此,我写了这篇《给 Android分享 开发者的 RxJava 详解》希望能給始终搞不明白什么是 RxJava 的人一些入门的指引,或者能让正在使用 RxJava 但仍然心存疑惑的人看到一些更深入的解析无论如何,只要能给各位同為 Android分享 工程师的你们提供一些帮助这篇文章的目的就达到了。
??最近公司的app有一些医生反馈說:预览患者发送的图片加载的特别慢并且经常加载不出来。
相信通过以上三步可以完全杜绝预览大图时的OOM的问题了
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。