開發一個複雜一點的Android應用都會用到網絡請求,互動和動畫。這些都意味着
要寫很多的回調嵌套。這樣的代碼也被稱為callback hell(回調地獄)。這樣的
提供了一個清晰、準确處理異步問題和事件的方法。
RxJava是一個ReactiveX在JVM上的實作,由NetFlix開發。這個庫在Java開發者中
廣為流傳。這個教程中你會學到如何在Android應用開發中使用RxJava。這裡Android中的RxJava
可以簡稱為RxAndroid。
要在android中使用RxAndroid,需要在build.gradle裡添加compile依賴項。
在使用RxJava的時候,你會經常遇到<code>Observer</code>和<code>Observable</code>的概念。
你可以把<code>Observable</code>了解為資料的生産者,而<code>Observer</code>則可以了解為資料的消費者。在RxJava裡
資料的生産者都是<code>Observable</code>類的執行個體,消費者都是接口<code>Observer</code>的執行個體。
類<code>Observable</code>有很多靜态方法,稱為operator。來建立類<code>Observable</code>的執行個體。以下
代碼示範了如何使用方法<code>just</code>方法(這就是上文說到的operator)來穿件一個非常簡單
的執行個體,并提供一個<code>String</code>資料:
我們剛剛建立的執行個體會在用有至少一個觀察者的時候發出資料。要建立一個觀察者,就需要建立
一個實作了接口<code>Observer</code>的類。接口<code>Observer</code>裡的方法可以處理從<code>Observable</code>執行個體發出的通知。
下面的觀察者可以把<code>Observable</code>執行個體發出的資料列印出來。
在Observable執行個體沒有資料在發出的時候調用。
在Observable執行個體遇到錯誤的時候調用。
在Observable執行個體每次發出資料的時候調用。
要給觀察者指定一個observable的執行個體,我們需要調用<code>subscribe</code>方法。這個方法會傳回一個<code>Subscription</code>
執行個體。下面的代碼讓<code>theObserver</code>觀察者觀察<code>theObservable</code>。
當觀察者添加到了observable執行個體中,observable執行個體就發出資料。是以,如果運作上面的代碼你會
看到hello world!被列印出來。具體如下:
一般來說方法<code>onCompleted</code>和<code>onError</code>不會用到,不過某些特殊情況也會用到,不過這裡不多叙述。
是以,有更加簡潔的可以用到<code>Action1</code>接口,這個接口隻有一個方法。
這樣送出了一個接口<code>action1</code>的執行個體之後,<code>Observable</code>的執行個體就發出資料。
要從observable中去除一個觀察者隻需要在<code>Subscription</code>執行個體上調用方法<code>unsubscribe</code>。
現在你已經知道如何建立觀察者和observable(可觀察對象)。下面來看看如何使用RxJava的operator(操作符)
來建立、轉換observable的,當然還有其他的一些操作。現在建立一個複雜一點的<code>Observable</code>對象。
這個對象發出一個<code>Integer</code>數組資料。方法<code>from</code>可以這個功能。
運作這段代碼你會發現數組中的資料一個接一個的列印了出來。
如果你熟悉javascript或者kotlin, 你就會對<code>map</code>和<code>filter</code>方法如何在數組中使用有一定的認識。
RxJava也有類似的operator來處理observable(可觀察對象)。由于java 7沒有lambda表達式,我們需要
模拟一下這個lambda表達式。要模拟隻接受一個參數的lambda表達式隻要建立一個實作了接口<code>Func1</code>的執行個體。
這裡你可以用<code>map</code>方法來周遊<code>listObservable</code>的每一個元素。這個例子會周遊observable每個整數并輸出這個數字的平方值。
輸入和輸出的值都是<code>Integer</code>類型的。
輸出數字的平方值。
這裡有一點需要注意的地方。<code>map</code>方法傳回的是一個新的<code>Observable</code>對象,這個方法本身并不改變
原本的<code>Observable</code>的執行個體。如果給<code>listObsevable</code>添加了觀察者,就會傳回這些數字的平方值。
Operator(操作符)可以成鍊式調用。比如,以下代碼使用了<code>skip</code>方法跳過前兩個數字,并使用<code>filter</code>方法
來忽略奇數:
輸出:
我們前面建立的observer(觀察者)和observable(可觀察對象)都是在單個的線程中運作的,都在Android的UI線程中。
這裡,我們要用RxJava來處理一些多線程的問題。同時,示範解決callback hell(回調地獄)的問題。
假設我們有一個叫做<code>fetchData</code>的方法,這個方法被用來從API上擷取資料。這個方法接受一個URL字元串
為參數,并傳回一個字元串。這個方法可以這麼使用:
是的,這個URL是github的API的一個例子。在這裡用正合适。
在Android裡,網絡請求不能在UI線程中,隻能另外開辟一個線程或者使用<code>AsyncTask</code>。有了RxJava之後
你就多了一個選項。是用<code>subscribeOn</code>和<code>observeOn</code>操作符(operator),你可以顯示的指出背景任務在哪個線程
運作,更新界面的任務在哪個線程(當然這必須是在UI線程)。
不過在繼續往下之前,我們需要把RxAndroid的擴充添加到項目依賴裡。這個庫是RxJava在Android上的擴充。
下面的代碼示範如何使用<code>create</code>操作符(operator)建立一個<code>Observable</code>對象。使用這個方法建立的
<code>Observable</code>對象必須實作<code>Observable.OnSubscribe</code>接口,并調用<code>onNext</code>, <code>onError</code>和<code>onComplete</code>
來控制發出什麼資料等操作。
把方法<code>fetchData</code>擷取的資料發出去。
這裡沒有什麼要做的。
如果出現了錯誤,那麼就發出錯誤資訊。
然後就可以給這個<code>asyncObservable</code>, <code>Observable</code>對象來調用<code>subscribeOn</code>和<code>observeOn</code>兩個方法來指定執行的
線程。
你也許覺得這個沒見的比<code>AsyncTask</code>或者<code>Thread</code>+<code>Handler</code>的組合好。是的,如果你隻是需要簡單的需要一個
背景運作的線程,不用RxJava也可以。
那麼我們考慮一個複雜一點的場景,你需要從兩個或以上不同的API并行的擷取資料,并且隻有在這些API的資料全部都傳回回來之後才
才更新一個view。如果你使用傳統的方式來處理,你需要些很多不必要的代碼以確定這些請求都完成而且沒有什麼錯誤。
再考慮另外一個場景,一個背景任務需要在前一個背景任務成功執行之後開始執行。如果用傳統的方法,這
将會走進回調地獄(callback hell)。
使用RxJava的operator(操作符),兩個場景都可以優雅的解決。比如,如果用<code>fetchData</code>方法從兩個不同的站點擷取資料,假設這兩個站點是
Yahoo和Google。這就需要建立兩個<code>Observable</code>對象,并使用<code>subscribeOn</code>方法讓他們裕興在不同的線程上。
要處理第一個場景,兩個請求需要并行的運作。我們可以使用<code>zip</code>操作符(operator)然後添加觀察者。
要處理後面一種場景的問題,可以使用方法<code>concat</code>操作符(operator)來運作有依賴關系的兩個線程。
RxAndroid有一個類叫做<code>ViewObservable</code>。專門用來友善處理view對象的各種相關事件。下面的
代碼将示範如何使用<code>ViewObservable</code>對象來處理<code>Button</code>的點選事件。
由于RxAndroid的改動,你需要給項目的依賴項裡添加新的庫:
<code>RxView.clicks(eventButton)</code>傳回一個<code>Observable</code>的對象。我們可以給這個對象調用各種前文
學到的操作符(operator)。比如,我們要按鈕跳過前三次點選,可以這麼做:
這裡用到了RxJava的觀察者<code>Observer</code>、<code>Observable</code>還有相關的操作符(operator)來處理異步操作和
事件。使用Rxjava會涉及到函數式程式設計、響應式程式設計等一些Android開發者幾乎不會涉及到的程式設計模式。
第一次接觸難免會遇到一些困難,這都無所謂。隻要繼續學習相關内容,都會習以為常。
歡迎加群互相學習,共同進步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,轉載請注明出處!
本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sunshine-anycall/p/5213552.html,如需轉載請自行聯系原作者