RxJava及RxJava2简述
RxJava2已经出来好久了,参加一些Android技术会议也经常能听到RxJava的名字。听很多人说RxJava的学习曲线很陡峭,我找了一些文章看看感觉也还好,可能是作者写的太好了,这其中自然少不了 扔物线 和 大头鬼。看了很多介绍后,我简要的做了一个总结,并用RxJava2对一些网络请求基于Volley的旧代码进行了改造,主要解决了“回调地狱”的问题。下面先简述我对RxJava的理解。
要用几个关键词来形容Rxjava的话,我觉得是:
- “异步”
- “观察者模式”
- “链式调用”
- “解耦”
异步是因为RxJava可以方便用操作符进行线程切换,这也是很多人使用RxJava的主要原因。
观察者模式是RxJava的基石,也是Rx响应式编程思想的基石。
链式调用是RxJava的展现形式,美观简洁清晰,一眼扫过链式调用的各操作符就能理解代码的功能。
解耦是使用RxJava的结果,之前各种嵌套调用,或者没必要拼到一起的逻辑,得以完全分开,而通过RxJava的事件流来重新组织在一起。
上述两张图展示了RxJava的基本模型,被观察者Observable调用来onNext/onCompleted/onError来将相应事件发送给观察者Observer,而Observer会依次处理Observable发来的多个事件。
在此基础上,RxJava定义了众多的操作符,常用的操作符主要可分为这五类:
- 创建 just from timer
- 转换 map flatMap buffer
- 过滤 filter first take
- 组合 zip concat merge
- 线程 subscribeOn observeOn
具体操作符的使用我就不一一细说了,网上已经有很多文章介绍。
与RxJava相关的东西有这几个:
- ReactiveX http://reactivex.io
- RxAndroid https://github.com/ReactiveX/RxAndroid
- RxBinding https://github.com/JakeWharton/RxBinding
- Retrofit http://square.github.io/retrofit/
ReactiveX是RxJava的思想来源,现在已经形成了一个庞大的社区。
RxAndroid经常在Android中来配合RxJava使用,不过里面也没啥东西,主要就用来切到Android的主线程。
RxBinding可以用来配合RxJava方便的绑定各控件的事件,比如点击checkBox后自动更新SharePreference。
Retrofit经常和RxJava配合使用处理网络请求。
而Rxjava2在RxJava的基础上,主要有如下变动:
- backpressure处理
- 不再支持传入null
- 允许函数throws Exception
- 重命名
背压backpressure是指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略。在 RxJava2 中,Observable 不再支持背压,而Flowable 支持非阻塞式的背压。并且规范要求,所有的操作符强制支持背压。
RxJava2操作符的参数不再允许传入null,否则会抛出空指针异常。
RxJava2的接口方法里加上了throws Exception,意味着在这些方法里调用一些会发生异常的方法不需要try-catch了。
对一些操作符和类进行了重命名,不细说了。
在大致了解了RxJava之后,我使用RxJava改写了这些请求:
- 嵌套回调
- 并行回调
- 循环调用
- 延时调用
- 防止连续点击
其中在嵌套回调上RxJava展现了很大的优势,因为在解耦请求之外,还可以进行统一的错误处理。具体见:
未来有空的话我会完善相关实例。
最终,我认为RxJava的主要优点是:
- 有助于解决callback hell
- 链式调用处理异步任务
- 统一的编程范式
- 可以扩展自己的操作符
当然,也不应过度使用RxJava,一些简单的代码就还是完全没必要改的。
推荐资料:
给Android开发者的RxJava详解(扔物线)
RxJava使用场景小结(大头鬼Bruce)
RxJava使用介绍(一叶飘舟)
RxJava之错误处理(行云间)
RxJava1.X升级到RxJava2.X笔记(续写经典)
RxJava 2.0 全新来袭(拉丁吴)
RxJava使用场景小结(大头鬼Bruce)
RxJava使用介绍(一叶飘舟)
RxJava之错误处理(行云间)
RxJava1.X升级到RxJava2.X笔记(续写经典)
RxJava 2.0 全新来袭(拉丁吴)