我目前正在自学在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秒对服务器进行轮询?哪个类应该负责轮询,在哪一层?
所以首先,正如你已经读到的,不要使用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接口......),但这不在范围内,只有当你知道依赖注入时才会这样做;-)
请看一下这些资源。