首先要在app的build.gradle加入:
dependencies {
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.4.0-alpha03")
}
ViewModel scope、liveData & emit()、switchMap、emitSource這是在ViewModel中最方便使用coroutine(協程)的方式之一,
使用viewModelScope來執行耗時工程時,
會隨著ViewModel被清除而自動取消。
使用方式:
class MyViewModel : ViewModel() {
init {
viewModelScope.launch {
//做某些事 例如callApi
callApi()
}
}
}
以往我們在更新LiveData時,在ViewModel中的做法為:
//沒有liveData KTX的寫法
class MyViewModel : ViewModel() {
private val _result = MutableLiveData<String>()
val result: LiveData<String> = _result
init {
viewModelScope.launch {
val apiResult = callApi()
_result.value = apiResult
}
}
}
使用方式:
//KTX寫法
class MyViewModel : ViewModel() {
val result = liveData {
emit(callApi())
}
}
這方式可以直接取得immutable(不可變的) LiveData,
並透過emit提交改變。
比以前的_result.value = apiResult或_result.postValue(apiResult),
更為簡單明瞭。
覺得寫法上變的簡單很多> <
當我們需要在LiveData發生變化後,啟動coroutine(協程)時,會使用switchMap。
例如:當你需要在得到使用者登入得到token後,刷新首面的api。
使用Transformations.switchMap十分方便:
private val token = MutableLiveData<String>()
//得到token時才執行
val result = token.switchMap { token ->
liveData { emit(reloadHomePageApi(token)) }
}
result是一個immutable LiveData。
在每次token更新時,result會得到一個在執行完reloadHomePageApi(token)後,
回傳的新資料。
使用時機是:當你需要先行提交初始化value,
等成功呼叫後再回傳一次值時。
(使用頻率較小)。
使用方式:
liveData(Dispatchers.IO) {
emit(LOADING_STRING)
emitSource(dataSource.fetchWeather())
}
在這邊一樣只簡單列出幾個常用的方法,
如果有興趣研究更多可以看看官網的介紹喔。
參考: