首先要在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())
}
在這邊一樣只簡單列出幾個常用的方法,
如果有興趣研究更多可以看看官網的介紹喔。
參考: