你这个问题其实我刚开始接触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。是最开始根据微软的 http://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 :
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">他举了很多例子。 比如我们传统常见的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 不是什么用了就提高你代码逼格的东西。如果他解决不了你的问题,那么你就不是一个适合你的库,也不是一个你需要的库。不要为了用而用。