Android MVVM 架構(三)-使用 RxJava

GivemepasS
3 min readOct 4, 2019

Android MVVM 架構(二)-使用 Retrofit 我們使用了 Retrofit 這個套件,透過這個套件,我們可以很簡單的處理 Http Request,但是這樣還不夠方便,其實你可以透過 RxJava 來幫你處理掉。

完整程式碼

本篇所用到的最終程式碼放在 GitHub 連結如下。

GitHub

RxJava 擅長處理非同步問題,它可以幫你把所有的非同步引導到同一個介面,舉個例子來說,假設你要寫 OnClickListener、OnKeyDown,那麼就得實作對應的 interface,那一百種事件就會有一百種 interface,所以透過 RxJava 可以解決掉這個問題。

如果要使用 RxJava 搭配 Retrofit,其實 Square 公司已經幫你做好整合了,你只要在宣告的時候使用 RxJava 當做回傳值,就可以達到目的了。

interface ApiService {
@GET("/posts")
fun getPosts(): Single<List<Posts>>
}

接著 ViewModel 可以改成下面這樣。

fun callInfo() {
val result = StringBuffer()
infoRepository
.loadInfo()
.subscribeOn(Schedulers.newThread())
.map {
val sb = StringBuffer()
it.forEach { post ->
sb.append(post.body)
sb.append("\n")
sb.append("---------------------\n")
}
result.append(sb.toString())
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
userInfoLiveData.setValue(it.toString())
}, {
userInfoLiveData.setValue(result.toString())
})
}

你會發現透過這樣的方法跟原本 Android MVVM 架構(二)-使用 Retrofit 中的程式碼相比,簡化了許多,處理好再透過 LiveData 機制回傳給 View。

你可能會表示為什麼在 View 跟 ViewModel 之間就要使用 LiveData,而 ViewModel 與 Repository 之間卻是要用 RxJava,這個其實是 Google 官方建議的(可以參考Google I/O 2017),因為 LiveData 可以根據 View 的生命週期來做相對應的處理,但是 Repository 單純是資料面的問題,透過 RxJava 會是比較適合的工具。

Android MVVM 架構(一)-使用 ViewModel、LiveData、Factory 以及 Repository

Android MVVM 架構(二)-使用 Retrofit

Android MVVM 架構(四)-使用 Koin

--

--