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 全新来袭(拉丁吴)

猜你喜欢

转载自blog.csdn.net/wlkdb/article/details/74366555