[英]Android architecture components and coroutines
有很多關於架構組件、kotlin 和協程的信息,但我無法找到將所有這些東西結合在一起的示例。 我正在努力研究如何將此處描述的 android 架構組件與協程一起使用。 我有一個想法,但不確定它是否是實現這種架構風格的正確方法。 我正在嘗試將視圖 model + 存儲庫模式與改造和協程一起使用。
我有以下存儲庫:
class FooRepostiroy(private val fooHttpService: FooHttpService) {
suspend fun someMethod() : SomeResult {
val response = fooHttpService.someRemotCall() // which is also a suspending method using retrofit-2
// process response, store it using room and return SomeResult data object
然后我使用 ViewModel 中的 FooRepository,但因為 someMethod 是一種暫停方法,我需要將它包裝在協程 scope 中:
class FooViewModel(private val fooRepositoru : FooRepository) : ViewModel() {
private var someMethodJob : Job? = null
val result : MutableLiveData<SomeResult> = MutableLiveData()
fun someMethod() {
someMethodJob = viewModelScope.launch {
result.value = fooRepositoru.someMethod()
}
}
override fun onCleared() {
super.onCleared()
someMethodJob?.cancel()
}
然后在片段或活動中我可以觀察到視圖 model 結果
fooViewModel.result.observe(viewLifecycleOwner, Observer {
從我的存儲庫層開始,一切都可以是暫停的 function。 Then from the view model I can call any suspending function but never have a publicly exposed suspending function in my view model. 這是將協程與視圖 model 架構合並的正確方法嗎?
這是將協程與視圖 model 架構合並的正確方法嗎?
是的!
ViewModel
的每個實例都有自己的ViewModelScope
。
ViewModel
的目的是在ViewModelScope
的生命周期內運行作業,並在ViewModel
的父Activity/Fragment
被破壞的情況下自動取消正在運行的協程作業。
當ViewModel
被銷毀時, ViewModelScope
下任何正在運行的作業都將被取消。
在這里閱讀更多
private var someMethodJob: Job? = null val result: MutableLiveData<SomeResult> = MutableLiveData() fun someMethod() { someMethodJob = viewModelScope.launch { result.value = fooRepositoru.someMethod() } }
你可以放棄所有這些,然后說
val result: LiveData<SomeResult> = liveData {
emit(fooRepository.someMethod())
}
然后觀察result
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.