安卓架构组件和代码

问题描述 投票:0回答:1

有很多关于架构组件、kotlin和coroutines的信息,但我在任何地方都找不到将这些东西结合起来使用的例子。此处 和 coroutines 一起使用。我有一个想法,但感觉不确定是否是实现这种架构风格的正确方式,我试图使用视图模型+仓库模式,再加上retro fit和coroutines。

我有以下的仓库。

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是一个悬空的方法,我需要把它包裹在一个coroutine的范围内。

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()
    }

然后在片段或活动中,我可以观察视图模型的结果。

    fooViewModel.result.observe(viewLifecycleOwner, Observer {

从我的仓库层开始,所有的东西都可以是一个暂停函数,然后从视图模型开始,我可以调用任何一个暂停函数,但在我的视图模型中永远不会有公开的暂停函数。然后在视图模型中,我可以调用任何悬浮函数,但在我的视图模型中永远不会有一个公开暴露的悬浮函数。这是否是将coroutine与视图模型架构相结合的正确或恰当的方式?

android kotlin android-architecture-components kotlin-coroutines
1个回答
0
投票

这是将coroutines与视图模型架构结合起来的正确或恰当的方式吗?

是的!

视图模型的每个实例 ViewModel 有自己 ViewModelScope.

宗旨 ViewModelScope 是在该生命周期内运行的作业。ViewModel 并负责在父节点的情况下自动取消正在运行的coroutine作业。Activity/FragmentViewModel 被销毁。

任何正在运行的工作在 ViewModelScope 时,将被取消。ViewModel 将被摧毁。

阅读更多 此处


0
投票
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.

© www.soinside.com 2019 - 2024. All rights reserved.