標籤:注意 美工 許可權 out 伺服器 fill 更新 fit view
本文已授權公眾號:鴻洋(hongyangAndroid)原創首發。
作為主流的第三方架構Rx系列,不學習也不行啊,對於初學者來說,可能RxJava看起來很難,用起來更難,但是你要知道,越複雜的東西往往能解決越複雜的問題,有可能你應用在項目中,也許你在面試的時候,就會和初級工程師拉開一大段距離。這門課程需要大家有Retrofit的基礎,如果想學習Retrofit的同學可以查看我的部落格,廢話不多說,Hensen老師開車了。
用原話就是:RxJava2是一個在Java虛擬機器上,使用可觀察的序列構成基於事件的,非同步程式庫。不理解沒關係,可以類比成我們的AsyncTask,這樣就好理解多了
RxJava傳送門:https://github.com/ReactiveX/RxJava
觀察者模式就是RxJava使用的核心點,掌握這個模式,可以理解RxJava更簡單,觀察者模式簡單的說就是”訂閱-發布”的模式,舉一例子說,當你訂閱某家牛奶店的早餐奶(訂閱過程),只要牛奶店生產牛奶,便會給你送過去(發布過程)。這裡的牛奶店只有一家,但是訂閱的人可以很多,這是一種一對多的關係,只要牛奶店發布牛奶,那麼訂閱的人就會收到牛奶。換做RxJava裡面的話,牛奶店就是被觀察者(Observable),訂閱的人就是觀察者(Observer)
這裡我們舉一例子學校點名的例子,首先建立我們所說的觀察者和被觀察者
各位可以思考一下,根據上面的介紹,學生和老師,誰是觀察者,誰是被觀察者,下面就看代碼給你分析
通過代碼可以看到,注意分別實現的不同介面
1、老師是被觀察者,他需要實現介面的方法
- 訂閱/取消訂閱:往集合中存放/移除觀察者
- 發布:迴圈遍曆觀察者,調用觀察者方法
2、學生是觀察者,那麼我們只需要給他個名字,實現觀察者的方法即可
最後,我們就把觀察者和被觀察者關聯起來,LessonStart (上課啦)
代碼很簡單,我們類比了一個老師和小明同學和小紅同學,老師已經知道看到兩個人來了,那麼可以開始點名了,下面通過Log列印出資訊
首先我先貼出我們後面所用到的第三方依賴庫,以免後面忘記說了,大家對號入座
其次還需要添加連網許可權
最後我們回到正題,看完上面的例子,我們可以知道RxJava就是這種訂閱和發布的模式,換成我們的RxJava代碼應該是怎麼樣的?當然也是通過被觀察者訂閱觀察者啦
我們具體被觀察者和觀察者的實現,當然是建立出來啦
onNext方法就是我們的發布過程,我們看其觀察者的建立就知道怎麼回事了
我們可以發現,觀察者的建立實現的方法,在被觀察者中是對應起來的,也就是說,我們發布了什麼,就可以在觀察者中收到訂閱資訊,那麼我們就可以在代碼中編寫我們的邏輯了,這樣基本上已經使用好了RxJava了,通過Log列印出資訊
1、人類就喜歡酷炫,炫耀,當然RxJava也少不了人類這種心理,就是鏈式編程,下面這段代碼可以完美替代上面的所有代碼
這裡我多寫了兩個方法,也就是.subscribeOn(Schedulers.io())和.observeOn(AndroidSchedulers.mainThread()),這裡就是RxJava的好處之一,他可以手動切換線程,這兩個方法在這裡表示被觀察者建立實現的方法都放在io線程也就是子線程,因為在被觀察者中通常會調用網路資料請求,那麼網路請求必須在子線程運行,當網路請求收到後,則發布出去,在觀察者中通過TextView等控制項展示在介面上,那麼UI的更新必須在主線程進行,也就是我們上面的代碼mainThread。如果你不深造RxJava,基本上這兩個方法已經成了固定的寫法,這也是很多初學者忘記添加上去的方法
2、久而久之,人類喜歡簡潔,喜歡定製服務,巧了,RxJava也給你滿足了,下面這段代碼中,實現的方法跟上面的實現方法是對應起來的,大家看參數就知道哪個對應哪個了,你可以通過new Consumer,不需要實現的方法你可以不寫,看上去更簡潔,這裡我為了方便大家看,都new出來了,Consumer就是消費者的意思,可以理解為消費了onNext等等等事件
哦,對了,我們還忘記列印Log資訊,不能否認了我很帥這個事實
當然你覺得只要誇獎我一個帥就行了,那麼你也可以通過下面這幾種方法發送給觀察者
這裡的案例使用我們平時最簡單的需求,看就知道(圖片會卡,效果大家腦補)
這裡是整個代碼的實現思路,我會在代碼下面注釋一下需要注意的點,代碼我就直接貼出來,有句話說得好,成為大神,就必須先學會閱讀別人的代碼,哈哈哈,My Code閱讀起來應該沒問題的吧
1、操作符
- 像這種interval、take、map、observeOn、doOnSubscribe、subscribe都是屬於RxJava的操作符,簡單的說就是實現某個方法,裡面的功能都被封裝起來了
- RxJava支援的操作符很多,很多操作符用起來都簡單,但是組合起來就很複雜,功能很強大,具體分類
2、操作符介紹
- interval:延時幾秒,每隔幾秒開始執行
- take:超過多少秒停止執行
- map:類型轉換,由於是倒計時,案例需要將倒計時的數字反過來
- observeOn:在主線程運行
- doOnSubscribe:在執行的過程中
- subscribe:訂閱
RxJava與Retrofit的使用,更像我們的AsyncTask,通過網路擷取資料然後通過Handler更新UI
人類總是喜歡看圖說話,巧了,我給你提供了,我只能拿出我過硬的美工技術給你們畫圖了
① Bean對象
- 這裡我們採用的是httpbin的一個post介面,各位可以在它的網站試一下,這裡的NetBean是通過請求返回的資料,進行GsonFormat產生的
② ApiService
- 這裡返回Observable對象,也就是我們RxJava的被觀察者
③ RxJava+Retrofit的實現
1、Retrofit
- RxJava與Retrofit一起使用必須在Retrofit上加上這句話addCallAdapterFactory(RxJava2CallAdapterFactory.create())
2、RxJava
- 我們通過just方式發送資料
- flatMap方法是用於資料格式轉換的方法,其後面的參數UserParam與ObservableSource< NetBean>,參數一表示原資料,參數二表示轉換的資料,那麼就是通過發送網路參數,轉換成網路返回的資料,調用Retrofit
這個案例其實就是使用者添加購物車的時候,首先會在本機存放區一份,然後發現如果沒有網路,那麼沒辦法提交到伺服器上,只能等下一次有網路的時候採用本機資料庫和伺服器資料的合并來實現上傳到伺服器,這裡我們就貼RxJava與Retrofit的代碼,不貼其他代碼了,廢話不多說,
這裡使用到merge的操作符,其表示意思就是將兩個ObservableSource合并為一個ObservableSource,最後的列印結果是
RxBinding的使用也是為了讓介面看起來更簡潔,剩去了傳統的findViewById和setOnClickListener的方法,不用任何聲明,只要添加依賴就可以直接使用了
這裡的案例是說當我們在EditText打字即時搜尋的時候,可能使用者會打字很會快,中老年服裝那麼我們就沒有必要一直發送網路請求,請求搜尋結果,我們可以通過當使用者打字停止後的延時500毫秒再發送搜尋請求
操作符
- RxTextView.textChanges(edittext):Rxbinding用法
- debounce:表示延時多少秒後執行
- switchMap:也是資料轉換,與flatMap的區別在注釋中解釋很清楚了
示範
這個案例很簡單,當使用者一直點擊一個按鈕的時候,我們不應該一直調用訪問網路請求,而是 1秒內,只執行一次網路請求
源碼下載
聽說認真看的同學都會學的很多哦,對於RxJava的操作符還是建議大家通過官網的wiki去深造,回力只有當RxJava用在項目中的時候,你才會體會它的好處,同時也讓你與初級工程師有了一定的距離,像很多RxBus、RxPermission、RxAndroid,很多人會疑問要不要去學習它,毫無疑問是必須學習的,技術是不斷更新,只有當你的技術跟上時代的時候,你才有可能和大神聊的津津有味,以上純屬瞎掰,當然有時間我也會去學習Rx系列,如果喜歡我的朋友可以關注我的部落格,或者加群大家一起學習吧
Android實戰——RxJava2+Retrofit+RxBinding解鎖各種新姿勢