Android 如何使用LiveData和MVVM架构轮询服务器?

Android 如何使用LiveData和MVVM架构轮询服务器?,android,Android,我目前正在自学如何在Android中实现MVVM体系结构。我是新来的,请帮帮我。我将首先解释我正在开发的应用程序 我想制作一个应用程序,每N秒轮询一个远程服务器,并在UI中显示更新的数据。在UI中,用户还应该能够删除和编辑数据(从现有数据列表中,无需更新服务器) 目前,我有模型、存储库、视图模型和视图层的包和类。Repository类以MutableLiveData类型返回数据,ViewModel调用Repository类并以LiveData类型返回数据,View通过调用ViewModel类观察

我目前正在自学如何在Android中实现MVVM体系结构。我是新来的,请帮帮我。我将首先解释我正在开发的应用程序

我想制作一个应用程序,每N秒轮询一个远程服务器,并在UI中显示更新的数据。在UI中,用户还应该能够删除和编辑数据(从现有数据列表中,无需更新服务器)

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

目前,我收到了主异常上的
网络
,据我所知,我必须创建一个异步任务来处理这个问题。但是,它已经贬值了,所以我想使用其他选项,比如Executor


最好是Java建议。Executor类应该在哪一层?此外,如何每N秒轮询一次服务器?哪个类应该负责轮询,在哪个层

因此,首先,正如您已经阅读的,不要使用AsyncTask,因为它已被弃用,但您已经走上了一条很好的道路

你听说过协同程序吗(参见链接1和链接2)?它们是为异步、非阻塞代码设计的轻量级线程,非常适合您的需要。 您可以轻松地在viewModel中启动一个(例如,使用“viewModelScope”,请参见#3),从存储库调用您的方法(或usecase,如果您有,但不是必需的),从网络中获取数据(改装或您使用的任何工具),并将函数标记为挂起函数(suspend function是一个可以暂停并在稍后->完成网络调用时继续的函数)。在viewModel中,您可以轻松地将数据(请参见#4)从可变liveData切换到liveData,并从视图中观察liveData

简短示例:

片段:

viewModel.data.observe(viewLifecycleOwner, Observer {
    // connect data to your recyclerView adapter
})
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)
   }
}
suspend fun getData(): Data {
    // call your network client to get the data you want
    return api.getData()
}
视图模型:

viewModel.data.observe(viewLifecycleOwner, Observer {
    // connect data to your recyclerView adapter
})
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)
   }
}
suspend fun getData(): Data {
    // call your network client to get the data you want
    return api.getData()
}
注: 我建议您为api和存储库使用接口,并将其注入(viewModel中的存储库接口,存储库中的api接口…),但这超出了范围,并且仅当您了解依赖项注入时;-)

看看这些资源:


  • 你的问题是什么?这回答了你的问题吗?谢谢你的资源!如果我用java编码呢?协同程序似乎是Kotlin独有的功能:/抱歉,我不知道您使用java编写代码。但对于java,我建议看一看RxJava2,在这里您可以轻松地在主线程和IO线程之间切换。看看这个(跳过匕首部分):。有趣的部分是:“.subscribeOn(Schedulers.io().observeOn(AndroidSchedulers.mainThread())”。在io线程上订阅,但在主(UI)线程上观察。有很多示例和教程可以帮助您,请尝试搜索例如rxjava2和viewmodel:)