Android: 在哪里安排工作?
Android: Where to schedule a job?
我正在使用 LiveData+Room+ViewModel 构建一个简单的 kotlin 应用程序。主要 activity(显示一个列表)正在从 ViewModel 获取所需数据,ViewModel 从数据库获取信息(数据在被 activity 使用之前进行转换)。现在,我需要允许用户通过滑动来刷新数据。发生这种情况时,应用程序应检查当前连接是否可用于该连接,如果不能,则应用程序应安排作业。
目前,我正在将这项工作(检查当前连接和最终的作业调度)委托给我的 ViewModel。它看起来像这样:
fun tryToRefreshDataFromService(){
//first, check if there's network
//If there is, call web service and then update db
//if no network, schedule a job and try to refresh from the database
if(canGetDataFromNetwork()){
Timber.d("With network access, getting data from web services")
WebServiceAsyncTask(newsManager).execute()
}
else{
//schedule job for refreshing
//no network access, setting up job
Timber.d("No network access, setting up job")
scheduleJob()
}
}
然后 activity 将能够从辅助方法(处理刷卡刷新事件)中调用该方法:
private fun recoverDataForTabs(swiper: SwipeRefreshLayout? = null){
_swiper = swiper //for clearing
_viewModel.tryToRefreshDataFromService()
}
但是,seems 这样做确实是个坏主意,因为 ViewModel 似乎不应该对 Android 框架 类 有任何了解(最终需要这个案例)。那么,这是否意味着我应该更新我的代码,以便从 activity 完成网络检查 + 作业调度?
谢谢
您可以将 framework-related 个对象注入您的 ViewModels
。例如:
class MyViewModel(val networkChecker: IMyNetworkChecker, val jobSetter: IMyJobSetter, ...) {
fun tryToRefreshDataFromService(){
if(networkChecker.canGetDataFromNetwork()){
Timber.d("With network access, getting data from web services")
WebServiceAsyncTask(newsManager).execute()
}
else{
Timber.d("No network access, setting up job")
jobSetter.scheduleJob()
}
}
}
我正在使用 LiveData+Room+ViewModel 构建一个简单的 kotlin 应用程序。主要 activity(显示一个列表)正在从 ViewModel 获取所需数据,ViewModel 从数据库获取信息(数据在被 activity 使用之前进行转换)。现在,我需要允许用户通过滑动来刷新数据。发生这种情况时,应用程序应检查当前连接是否可用于该连接,如果不能,则应用程序应安排作业。
目前,我正在将这项工作(检查当前连接和最终的作业调度)委托给我的 ViewModel。它看起来像这样:
fun tryToRefreshDataFromService(){
//first, check if there's network
//If there is, call web service and then update db
//if no network, schedule a job and try to refresh from the database
if(canGetDataFromNetwork()){
Timber.d("With network access, getting data from web services")
WebServiceAsyncTask(newsManager).execute()
}
else{
//schedule job for refreshing
//no network access, setting up job
Timber.d("No network access, setting up job")
scheduleJob()
}
}
然后 activity 将能够从辅助方法(处理刷卡刷新事件)中调用该方法:
private fun recoverDataForTabs(swiper: SwipeRefreshLayout? = null){
_swiper = swiper //for clearing
_viewModel.tryToRefreshDataFromService()
}
但是,seems 这样做确实是个坏主意,因为 ViewModel 似乎不应该对 Android 框架 类 有任何了解(最终需要这个案例)。那么,这是否意味着我应该更新我的代码,以便从 activity 完成网络检查 + 作业调度?
谢谢
您可以将 framework-related 个对象注入您的 ViewModels
。例如:
class MyViewModel(val networkChecker: IMyNetworkChecker, val jobSetter: IMyJobSetter, ...) {
fun tryToRefreshDataFromService(){
if(networkChecker.canGetDataFromNetwork()){
Timber.d("With network access, getting data from web services")
WebServiceAsyncTask(newsManager).execute()
}
else{
Timber.d("No network access, setting up job")
jobSetter.scheduleJob()
}
}
}