Android MVVM 架構(三)-使用 RxJava

Android MVVM 架構(三)-使用 RxJava

情境

如何使用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 會是比較適合的工具。