簡體   English   中英

Android架構組件和協程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM