繁体   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