1. 程式人生 > >我對rxjava的理解

我對rxjava的理解

你這個問題其實我剛開始接觸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">
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<List<Future<T>>>。

而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 不是什麼用了就提高你程式碼逼格的東西。如果他解決不了你的問題,那麼你就不是一個適合你的庫,也不是一個你需要的庫。不要為了用而用。