【Android】RxJava的使用(一)基本用法
前言
最近經(jīng)常看到RxJava這個字眼,也看到很多人在博客中推薦使用RxJava。好奇的我怎么能錯過,于是Google了一下,說RxJava好用的和說RxJava難用的都有,于是自己也親自嘗試了一下(感覺不容易上手)。寫博客記錄下學(xué)習(xí)的過程,一方面作為鞏固,另一方面希望能幫助到初學(xué)者。
(第一篇只介紹了RxJava的基本用法,暫時還無法看出RxJava的優(yōu)勢。切莫著急,隨著慢慢深入就能體會到RxJava帶來的方便了)
(本文部分內(nèi)容引用自該博客)
介紹
在GitHub主頁上的介紹:
a library for composing asynchronous and event-based programs using observable sequences for the Java VM翻譯過來就是:
一個在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫對于新手們來說這個太抽象了,我們(我也是新手)需要看到看到一個更加具體的解釋,簡單來說,它就是一個實現(xiàn)異步操作的庫。(還是不懂?看代碼更實在)
優(yōu)點
RxJava的好處就在于它的簡潔性,邏輯簡單的時候看不出RxJava的優(yōu)勢,想必大家都知道在調(diào)度過程比較復(fù)雜的情況下,異步代碼經(jīng)常會既難寫也難被讀懂。這時候RxJava的優(yōu)勢就來了,隨著程序邏輯變得越來越復(fù)雜,它依然能夠保持簡潔。
觀察者模式
首先要先介紹一下觀察者模式(可能比喻的不夠恰當(dāng),意思到了就好);
- 觀察者:監(jiān)視著被觀察者的行為,當(dāng)被觀察者某個狀態(tài)改變的時候會通知觀察者,觀察者會執(zhí)行對應(yīng)的操作;
- 被觀察者:被監(jiān)視的對象,當(dāng)某個狀態(tài)改變的時候會通知觀察者;
- 訂閱(或注冊):將觀察者和被觀察者建立聯(lián)系。
(很亂?來個栗子?)
這里舉一個我個常用的例子,點擊Button后觸發(fā)OnClickListener
中的onClick()事件。在這個事件中他們的角色分別如下:
- 觀察者:OnClickListener;
- 被觀察者:Button;
- 訂閱(或注冊):setOnClickListener()。
RxJava
在上面介紹了觀察者模式,這里也將RxJava中的三個角色進行一下角色分配
- 觀察者:Observer;
- 被觀察者:Observable;
- 訂閱(或注冊):subscribe()。
- 觀察者
Observer 即觀察者,它決定事件觸發(fā)的時候?qū)⒂性鯓拥男袨椤?br />RxJava 觀察者的事件回調(diào)方法除了普通事件onNext()(相當(dāng)于onClick()/onEvent())之外,還定義了兩個特殊的事件:onCompleted()和onError()。
- onCompleted(): 事件隊列完結(jié)。RxJava 不僅把每個事件單獨處理,還會把它們看做一個隊列。RxJava 規(guī)定,當(dāng)不會再有新的onNext()發(fā)出時,需要觸發(fā)onCompleted()方法作為標(biāo)志。
- onError(): 事件隊列異常。在事件處理過程中出異常時,onError()
會被觸發(fā),同時隊列自動終止,不允許再有事件發(fā)出。
- 在一個正確運行的事件序列中,onCompleted()和onError()有且只有一個,并且是事件序列中的最后一個。需要注意的是,onCompleted()
和onError()二者也是互斥的,即在隊列中調(diào)用了其中一個,就不應(yīng)該再調(diào)用另一個。
- 被觀察者
Observable 即被觀察者,它決定什么時候觸發(fā)事件以及觸發(fā)怎樣的事件。可以使用create()、just(T...)、from(T[])或from(Iterable<? extends T>)來創(chuàng)建一個 Observable ,并為它定義事件觸發(fā)規(guī)則。
- 訂閱
創(chuàng)建了Observable和Observer之后,再用subscribe()方法將它們聯(lián)結(jié)起來
直接看代碼吧,這里只展示了RxJava的基本用法,暫時看不出RxJava的優(yōu)勢。
使用
例:打印機個字符串
添加依賴
上面完成了一次Rxjava的基本使用。
擴展
- Subscriber
除了Observer接口之外,RxJava 還內(nèi)置了一個實現(xiàn)了Observer的抽象:Subscriber。Subscriber對Observer接口進行了一些擴展,但他們的基本使用方式是完全一樣的:
Subscriber<String> subscriber = new Subscriber<String>() {@Overridepublic void onNext(String s) {Log.d(tag, "Item: " + s);}@Overridepublic void onCompleted() {Log.d(tag, "Completed!");}@Overridepublic void onError(Throwable e) {Log.d(tag, "Error!");} };不僅基本使用方式一樣,實質(zhì)上,在 RxJava 的 subscribe 過程中,Observer也總是會先被轉(zhuǎn)換成一個Subscriber再使用。如圖:
所以如果你只想使用基本功能,選擇Observer和Subscriber是完全一樣的。它們的區(qū)別對于使用者來說主要有兩點:
- onStart(): 這是Subscriber增加的方法。它會在 subscribe 剛開始,而事件還未發(fā)送之前被調(diào)用,可以用于做一些準(zhǔn)備工作,例如數(shù)據(jù)的清零或重置。這是一個可選方法,默認(rèn)情況下它的實現(xiàn)為空。需要注意的是,如果對準(zhǔn)備工作的線程有要求(例如彈出一個顯示進度的對話框,這必須在主線程執(zhí)行),onStart()就不適用了,因為它總是在 subscribe 所發(fā)生的線程被調(diào)用,而不能指定線程。要在指定的線程來做準(zhǔn)備工作,可以使用doOnSubscribe()方法,具體可以在后面的文中看到。
- unsubscribe(): 這是Subscriber所實現(xiàn)的另一個接口Subscription
的方法,用于取消訂閱。在這個方法被調(diào)用后,Subscriber將不再接收事件。一般在這個方法調(diào)用前,可以使用isUnsubscribed()先判斷一下狀態(tài)。unsubscribe()這個方法很重要,因為在subscribe()之后,Observable會持有Subscriber的引用,這個引用如果不能及時被釋放,將有內(nèi)存泄露的風(fēng)險。所以最好保持一個原則:要在不再使用的時候盡快在合適的地方(例如onPause()onStop()等方法中)調(diào)用unsubscribe()來解除引用關(guān)系,以避免內(nèi)存泄露的發(fā)生。
- Observable
Observable的其他幾種創(chuàng)建方法,一下Observable等價于之前使用Create()創(chuàng)建的Observable:
1、使用Observable.just()創(chuàng)建被觀察者
2、使用Observable.from()創(chuàng)建被觀察者
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);小結(jié)
目前沒看出RxJava的任何好處,感覺代碼還多了~~~
(別急,因為是第一篇,我只介紹了他們之間的關(guān)系以及最基礎(chǔ)的用法。后面的幾篇我會介紹RxJava的其他功能,還有一些復(fù)雜的嵌套關(guān)系的處理,到時候知道RxJava的強大之處了)
更多:
Android RxJava的使用(二)Action
Android RxJava的使用(三)轉(zhuǎn)換(map、flatMap)
Android RxJava的使用(四)線程控制 —— Scheduler
總結(jié)
以上是生活随笔為你收集整理的【Android】RxJava的使用(一)基本用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 寒假作业二编程总结
- 下一篇: Android Binder的使用