情境
在 如何使用Android MVVM 架構(二)-使用 Retrofit 我們使用了 Retrofit 這個套件,透過這個套件,我們可以很簡單的處理 Http Request,但是這樣還不夠方便,其實你可以透過 RxJava 來幫你處理掉。
完整程式碼
如果需要完整的程式碼,可以到 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 會是比較適合的工具。