如何用LiveData和MVVM架构的投票服务器?[已关闭]

问题描述 投票:-3回答:1

我目前正在自学在Android中实现MVVM架构。我是完全的新手,所以请大家帮帮我。我先解释一下我正在做的app。

我想做一个应用,每隔N秒就会对远程服务器进行一次轮询,并在UI中显示更新的数据。在UI中,用户应该也可以删除和编辑数据(从现有的数据列表中删除,不需要更新服务器)。

目前我有Model、Repository、ViewModel和View层的包和类。Repository类以MutableLiveData类型返回数据,ViewModel调用Repository类并以LiveData类型返回数据,View通过调用ViewModel类观察LiveData。

目前,我收到的是 Network on Main Exception 据我所知,我必须创建一个AsyncTask来处理这个问题。然而,它已经贬值了,所以我想使用其他选项,比如Executor。

如果有Java的建议会更好。Executor类应该在哪一层?另外,如何才能每N秒对服务器进行轮询?哪个类应该负责轮询,在哪一层?

android
1个回答
2
投票

所以首先,正如你已经读到的,不要使用AsyncTask,因为它已经被废弃了,但你已经在一个很好的方式。

你听说过coroutines吗(见链接#1和#2)?它们是轻量级的线程,是为异步、非阻塞代码而生的,非常适合你的需求.你可以很容易地在viewModel中启动一个(用例如 "viewModelScope",见#3),从你的仓库(或者usecase,如果你有它们,但不是必须的)调用你的方法,从网络(retrofit或者你使用的任何东西)中获取数据,并将函数标记为suspend函数(suspend函数是一个可以暂停并在以后继续的函数->当网络调用完成后)。在viewModel中,你得到了数据,并可以很容易地将数据(见#4)从mutableLiveData切换到liveData,并从你的视图中观察liveData。

简短的例子。

Fragment:

viewModel.data.observe(viewLifecycleOwner, Observer {
    // connect data to your recyclerView adapter
})

ViewModel:

private val _data = MutabeLiveData<Model>()
val data: LiveData<Model> = _data


fun getData() {
   viewModelScope.launch {
        // call your repo / usecase to get data
        val data = repository.getData()
        _data.postValue(data)
   }
}

Repository:

suspend fun getData(): Data {
    // call your network client to get the data you want
    return api.getData()
}

注意:我建议你为api和仓库使用接口并注入它们(视图模型中的仓库接口,仓库中的api接口......),但这不在范围内,只有当你知道依赖注入时才会这样做;-)

请看一下这些资源。

  1. https:/developer.android.comkotlincoroutines。
  2. https:/kotlinlang.orgdocsreferencecoroutines-overview.html。
  3. https:/medium.comandroiddevelopseasy-coroutines-android-viewmodelscope-25bffb605471。
  4. https:/medium.comandroiddeveloperslivedata-beyond-the-viewmodel-reactive-patterns-using-transformations-and-mediatorlivedata-fda520ba00b7。
© www.soinside.com 2019 - 2024. All rights reserved.