我对rxjava的理解

作者:BinaryTree
链接:https://www.zhihu.com/question/53151203/answer/164427549
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你这个问题其实我刚开始接触RxJava的时候也问过自己很多次。原因也是网上的教程大多浅尝辄止,举例不恰当,大多数全是retrofit或者随意组合几个操作符(这也难怪,毕竟很多App也没什么太复杂的业务逻辑,都是一样的crud应用,找个Restful API 写几个 material界面就是一个几百GitHub star的 MVP + RxJava + Retrofit + etc 的开源项目了),讲来讲去满篇文章就是几个词。什么优雅,简洁,切换线程方便。 无论是初学者还是Android老手都体会不出 RxJava 究竟带给我们什么方便。

RxJava这种库和其他常见的不太一样。 一般的库比如Retrofit , Okhttp, Butterknife , Picasso 等等是为了解决实际问题的。提供的是Solution。 比如Retrofit就是帮你做网络请求,而且是针对Restful API。 Picasso就是为了加载图片。 xxxView就是想做一个方便,好看的 View。

而RxJava 看名字 Reactive Extension for Java。是最开始根据微软的 Rx.Net 为基础,由Netflix主导做出的提供在JVM上实现Reactive Programming 的一种方式。同类的库还有Project Reactor, Akka 和Google 的 Agera等等。RxJava 本身就不是针对Android的库,甚至RxJava 2.0 原本设计时都是想基于Java 8 stream的。后来由于Jake Wharton才使得RxJava 2.0 有了Java 6的支持。

我们先来看一下Netfilx最初为什么使用或者说创造RxJava :


<img src="https://pic3.zhimg.com/50/v2-35ca79a4ca4ca8d01cf134c05ce5bee6_hd.png" data-rawwidth="845" data-rawheight="434" class="origin_image zh-lightbox-thumb" width="845" data-original="https://pic3.zhimg.com/v2-35ca79a4ca4ca8d01cf134c05ce5bee6_r.png"> 我对rxjava的理解_第1张图片
Owner of API should retain control of concurrency behavior。

他举得例子也是很常见。 如果一切都是同步的。那么没有问题,你调用这个getData()就会得到Data。但是如果服务器端这是异步的呢? 你的下文还需要这个Data怎么办?

<img src="https://pic3.zhimg.com/50/v2-152dce41e42a394841d575db071e27fa_hd.png" data-rawwidth="844" data-rawheight="433" class="origin_image zh-lightbox-thumb" width="844" data-original="https://pic3.zhimg.com/v2-152dce41e42a394841d575db071e27fa_r.png"> 我对rxjava的理解_第2张图片

他举了很多例子。 比如我们传统常见的CallBack, Future。 但是如果一旦数据逻辑变得复杂。 就很难办,而造成Callback Hell。 比如图中所示的 Future>>。

而Observable有什么不一样? 其实简单的说也是一种IOC。每一个Subscriber 都默认Observable是异步执行。我只需知道你在不久的将来能给我0或多个规定类型的数据。我或是将他做变形处理(map),或是和其他数据合并(zip) 或者我将他传给其他的Observable(flatMap,publish)。 而上游只管同过Observable发送数据,或是异步或是同步。 下游只管处理,也无须关心上游数据到底怎么生成。

那么你可能也想问了。其实和CallBack也差不多啊。对的,其实CallBack/Listener等等就是最基础的响应式(这点是RxJava 2.x的主导作者 David 提出的,1st Generation Reactive)。而Observable通过 Observable Contract。 使得所有CallBack都可以走上同一个轨道。也就是我们所说的Stream的概念。 同过Stream的概念,我们处理异步操作和处理同步操作一样简单。

好了,我想讲的大概说完了。回答你的问题:

1. 我会不会在实际工作中使用RxJava? 我现在的公司虽然不让我用RxJava。 但是估计也马上实习结束了。 我想我应该是不回去不使用RxJava的公司。 你在题目里也说了,你经常使用Square 全家桶,Jake Wharton本人也是RxJava的主要贡献者。Square的app里几乎都使用RxJava。

2. RxJava 的学习门槛。 这个真的是说高也不高,说低也不低。主要还是一个思想的转变。RxJava的操作符群非常强大。很多你需要的功能都已经实现了,只不过你不认识或者不会组合。这个只有在想逻辑的时候翻翻Javadoc 然后试着按名字搜索一下,慢慢就轻车熟路了。所以门槛这么看蛮高的。

但是呢,你看说自己用了RxJava的项目那么多。90%都只用了Retrofit的adapter。站在巨人肩膀上,他们已经为我们做好heavy lift。 所以门槛这么看也不是太高。

P.S. 我个人真的不喜欢通过“简洁”,“漂亮”,“优雅”等等形容词来说RxJava的优点。 既不直观又很空洞。 RxJava 不是什么用了就提高你代码逼格的东西。如果他解决不了你的问题,那么你就不是一个适合你的库,也不是一个你需要的库。不要为了用而用。

发布于 2017-05-04
21 6 条评论
分享
收藏 感谢 收起

更多回答

简单一个字,会,Functional Programming和Reactive Programming是未来大趋势,而且用了就戒不掉了。
发布于 2016-12-15
2 3 条评论
分享
收藏 感谢
我本身是不会用这类库的,另外也不推荐大家用。
原因如下:
安卓app其实大多数只是作为显示端,就是说复杂的逻辑大多在服务端,可以说那些框架都是服务端转客户端的技术人员没事瞎几把移植过来的,适用场景真的是少之又少,另外真有合适的场景也不是非它不能解决。
还有一个原因是使用成本,新加入的同事大多没用过,要熟练的使用还要花不少时间。安卓framework本身就是一个通用的框架,在此基础上可以延伸一些自己的库,但在框架之上再整一个框架,就只能呵呵了。。。
ps:据我了解,一般是年轻的leader才会极力推这些框架,因为他们技术比不上一些不怎么懂管理但技术不错的老人,所以自己先研究一段时间拉开差距,再推新框架,手下有问题自己能处理,这样leader的位置就铁定能保住了。

你可能感兴趣的:(我对rxjava的理解)