最近常常看到RxJava這個字眼,也看到不少人在博客中推薦使用RxJava。好奇的我怎麼能錯過,因而Google了一下,說RxJava好用的和說RxJava難用的都有,因而本身也親自嘗試了一下(感受不容易上手)。寫博客記錄下學習的過程,一方面做爲鞏固,另外一方面但願能幫助到初學者。
(第一篇只介紹了RxJava的基本用法,暫時還沒法看出RxJava的優點。切莫着急,隨着慢慢深刻就能體會到RxJava帶來的方便了)java
參考: 給 Android 開發者的 RxJava 詳解
(本文部份內容引用自該博客)
在GitHub主頁上的介紹:react
a library for composing asynchronous and event-based programs using observable sequences for the Java VM
翻譯過來就是:android
一個在 Java VM 上使用可觀測的序列來組成異步的、基於事件的程序的庫
對於新手們來講這個太抽象了,咱們(我也是新手)須要看到看到一個更加具體的解釋,簡單來講,它就是一個實現異步操做的庫。(仍是不懂?看代碼更實在)異步
RxJava的好處就在於它的簡潔性,邏輯簡單的時候看不出RxJava的優點,想必你們都知道在調度過程比較複雜的狀況下,異步代碼常常會既難寫也難被讀懂。這時候RxJava的優點就來了,隨着程序邏輯變得愈來愈複雜,它依然可以保持簡潔。async
首先要先介紹一下觀察者模式(可能比喻的不夠恰當,意思到了就好);ide
(很亂?來個栗子?)post
這裏舉一個我個經常使用的例子,點擊Button後觸發OnClickListener
中的onClick()事件。在這個事件中他們的角色分別以下:學習
在上面介紹了觀察者模式,這裏也將RxJava中的三個角色進行一下角色分配spa
Observer 即觀察者,它決定事件觸發的時候將有怎樣的行爲。
RxJava 觀察者的事件回調方法除了普通事件onNext()(至關於onClick()/onEvent())以外,還定義了兩個特殊的事件:onCompleted()和onError()。線程
- onCompleted(): 事件隊列完結。RxJava 不只把每一個事件單獨處理,還會把它們看作一個隊列。RxJava 規定,當不會再有新的onNext()發出時,須要觸發onCompleted()方法做爲標誌。
- onError(): 事件隊列異常。在事件處理過程當中出異常時,onError()
會被觸發,同時隊列自動終止,不容許再有事件發出。
- 在一個正確運行的事件序列中,onCompleted()和onError()有且只有一個,而且是事件序列中的最後一個。須要注意的是,onCompleted()
和onError()兩者也是互斥的,即在隊列中調用了其中一個,就不該該再調用另外一個。
Observable 即被觀察者,它決定何時觸發事件以及觸發怎樣的事件。可使用create()、just(T...)、from(T[])或from(Iterable<? extends T>)來建立一個 Observable ,併爲它定義事件觸發規則。
建立了Observable和Observer以後,再用subscribe()方法將它們聯結起來
直接看代碼吧,這裏只展現了RxJava的基本用法,暫時看不出RxJava的優點。
例:打印機個字符串
添加依賴
compile 'io.reactivex:rxjava:1.0.14' compile 'io.reactivex:rxandroid:1.0.1'
//建立一個觀察者 Observer<String> observer = new Observer<String>() { @Override public void onCompleted() { Log.i(TAG, "Completed"); } @Override public void onError(Throwable e) { Log.i(TAG, "Error"); } @Override public void onNext(String s) { Log.i(TAG, s); } }; //使用Observable.create()建立被觀察者 Observable observable1 = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("Wrold"); subscriber.onCompleted(); } }); //訂閱 observable1.subscribe(observer);
以上用到的都是rx包裏面的,別用錯了!!!
上面完成了一次Rxjava的基本使用。
除了Observer接口以外,RxJava 還內置了一個實現了Observer的抽象:Subscriber。Subscriber對Observer接口進行了一些擴展,但他們的基本使用方式是徹底同樣的:
Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onNext(String s) { Log.d(tag, "Item: " + s); } @Override public void onCompleted() { Log.d(tag, "Completed!"); } @Override public void onError(Throwable e) { Log.d(tag, "Error!"); } };
不只基本使用方式同樣,實質上,在 RxJava 的 subscribe 過程當中,Observer也老是會先被轉換成一個Subscriber再使用。如圖:
因此若是你只想使用基本功能,選擇Observer和Subscriber是徹底同樣的。它們的區別對於使用者來講主要有兩點:
- onStart(): 這是Subscriber增長的方法。它會在 subscribe 剛開始,而事件還未發送以前被調用,能夠用於作一些準備工做,例如數據的清零或重置。這是一個可選方法,默認狀況下它的實現爲空。須要注意的是,若是對準備工做的線程有要求(例如彈出一個顯示進度的對話框,這必須在主線程執行),onStart()就不適用了,由於它老是在 subscribe 所發生的線程被調用,而不能指定線程。要在指定的線程來作準備工做,可使用doOnSubscribe()方法,具體能夠在後面的文中看到。
- unsubscribe(): 這是Subscriber所實現的另外一個接口Subscription
的方法,用於取消訂閱。在這個方法被調用後,Subscriber將再也不接收事件。通常在這個方法調用前,可使用isUnsubscribed()先判斷一下狀態。unsubscribe()這個方法很重要,由於在subscribe()以後,Observable會持有Subscriber的引用,這個引用若是不能及時被釋放,將有內存泄露的風險。因此最好保持一個原則:要在再也不使用的時候儘快在合適的地方(例如onPause()onStop()等方法中)調用unsubscribe()來解除引用關係,以免內存泄露的發生。
Observable的其餘幾種建立方法,一下Observable等價於以前使用Create()建立的Observable:
一、使用Observable.just()建立被觀察者
Observable observable2 = Observable.just("Hello", "World");
二、使用Observable.from()建立被觀察者
String [] words = {"Hello", "World"}; Observable observable3 = Observable.from(words);
或
List<String> list = new ArrayList<String>(); list.add("Hellow"); list.add("Wrold"); Observable observable4 = Observable.from(list);
目前沒看出RxJava的任何好處,感受代碼還多了~~~
(別急,由於是第一篇,我只介紹了他們之間的關係以及最基礎的用法。後面的幾篇我會介紹RxJava的其餘功能,還有一些複雜的嵌套關係的處理,到時候知道RxJava的強大之處了)
更多:
Android RxJava的使用(二)Action
Android RxJava的使用(三)轉換(map、flatMap)
Android RxJava的使用(四)線程控制 —— Scheduler
以上有錯誤之處感謝指出