第261期 / July 5, 2019

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

使用RxJava2實作響應式Android App

作者/李揚德

[發表日期:2019/7/5]

作者簡歷

目前任職於凌群電腦軟體事業群,主要專長有Android APP、Java、Asp.net C#系統開發,曾參與多項警政機關的專案系統開發與維護,工作內容包含了Android APP、Web及系統所需之相關程式開發及維運。

前言

響應式程式設計是一種基於非同步資料流概念的程式設計模式,資料流可以被觀測、過濾、操作或是與另一條資料流合併成新的一條資料流,響應式程式的設計關鍵在於事件,事件可能需要被等待或是觸發某個過程也可以觸發其他的事件,例如在關於氣象的APP中,我們從網路服務取得了天氣資料後就要更新APP畫面上的天氣狀態。在APP中常常會碰到呼叫網路服務、隨著使用者使用狀況修改UI的響應或是系統跳出訊息視窗都是響應式的概念,而RxJava2可以讓開發者更容易去處理非同步資料流的問題來達成響應式程式的設計,本篇會介紹RxJava2的基本概念以及將其簡單的運用到Android App來做示範。

使用RxJava2實作響應式Android App

Rxjava2是在Java virtual Machine中實現Reactive programming的開源library, RxJava的設計是為了讓程式開發者可以擺脫在處理非同步(asynchronous)資料流的痛苦,它可以使thread的切換變得更加容易,在開發Android的App開發中,經常會碰到需要呼叫Web Service、資料庫存取、檔案上傳或是其他的需要耗費大量時間的工作,若在不使用RxJava2或是其他相關的library時,我們就必須使用原生的library來處理這些事情,例如:AsyncTask或Handler,並且建立callback機制來知道甚麼時候這些事件完成了,但在大量且複雜的資料流處理時,在使用這種原生的方法時就會顯得繁瑣並且難以控制,舉例還說像是在Android App中可能會碰到我們需要同時去同時幾個Web Service,但在呼叫這幾個Web Service時又可能需要這幾個Web Service之中的回傳資料再傳出去取得其他資料時,這時如果是使用AsyncTask來處理,就必須要想辦法控制等前一個Web Service回傳的資料回來再將下一個Web Service所要的資料取出並且在傳過去,若沒控制好可能就會出問題,而RxJava可以幫我們簡化這些複雜的過程,並且降低出錯的可能性。

RxJava2是一套處理非同步(asynchronous)事件的library,這個library是基於觀察者的模式來設計的,在RxJava中主要會用到的物件包含了Observer、Observable以及Subscribe,這三者關係以電器來舉例的話,電器本身就是Observer而電器的開關是Observable,在控制開關做開啟或關閉的動作時中間傳輸訊號的電線就是Subscribe,當在控制開關時就會傳送打開或是關閉的訊號給電器,電器就會做出相對應的動作,下面會以Android App來實作上述範例以及說明RxJava2常用的方法:

一、在Android Studio建立一個新的專案:

打開build.gradle,在裡面加入RxJava2的最新版Library,這樣就可以在這個專案裡面使用RxJava2了。


《圖一》


二、Observer(電器)的動作:

接到開關指令,顯示訊息,在Observer裡面包含了四個重要的動作:
  • onNext(Object o):參數做為需要發送的數據,可以多次使用。


  • onError(Throwable e):事件發送的過程中若發生異常,則會使用此方法來結束發送,並且終止後續的事件發送。


  • onComplete():當onNext順利完成時會呼叫此方法。


  • onSubscribe(Disposable d):當被觀察者被觀察者訂閱時,會最先執行,而Disposable是一個管理是否終止事件發送的開關。


《圖二》


三、Observable(開關):

發送開或關的訊息給電器


《圖三》


另外可以使用Observable.just()讓Observable寫法更簡潔的方法


《圖四》


在RxJava2中提供幾個讓Observable寫法變得更簡潔的方法,像是Observable.just()就是其中一個方法,下面來介紹幾個Rxjava提供的簡化方法:
  • Observable.just():使用.Just()可將各種Object轉為Observable,Observable再將其發出。


  • Observable.from():使用.from()可以將物件的集合轉為Observable,例如:Array可以透過Observable.fromArray轉成Observable,再將它送出。


  • Observable.range():使用range()可以發送指定區間內的自然數。


  • Observable.interval():使用interval()可以送出無限序列的昇冪自然數,並且可以自己決定發送的時間間隔。


  • Observable.empty():empty()是創建一個沒有任何參數的Observable,通常用於測試Observable時使用。

四、Subscribe(電線):

負責傳送訊息


《圖五》


完整程式碼:


《圖六》


五、最後將App編譯並且執行:

打開Android Studio的Logcat就可以看到Observer收到的訊息。


《圖七》


結論

RxJava2的核心觀念在於它的觀察者模式,透過它可以處理非同步執行緒的問題,讓程式開發時可以更容易處理這類的狀況,並且它提供了更簡潔的方法,並且免除了過在處理非同步狀況時的callback處理,更增加了程式的邏輯以及可讀性,在App開發中時常會遇到非同步執行緒的問題,透過RxJava2可以大大降低在這方面的問題,讓在開發過程中可以更加的順利。


參考文獻

Get Started With RxJava 2 for Android :https://code.tutsplus.com/tutorials/getting-started-with-rxjava-20-for-android--cms-28345

Rxjava2 二三四五六訪:https://medium.com/@ome450901/rxjava2-%E4%BA%8C%E4%B8%89%E5%9B%9B%E4%BA%94%E5%85%AD%E8%A8%AA-29b6ab624ab2

RxJava系列一(簡介):https://codertw.com/android-開發/26002/#outline__3