Android:在哪里安排工作?

时间:2019-06-14 14:28:16

标签: android android-livedata android-viewmodel

我正在使用LiveData + Room + ViewModel构建一个简单的kotlin应用程序。主要活动(显示一个列表)是从ViewModel获取所需的数据,该ViewModel从数据库获取信息(数据在活动使用之前进行了转换)。现在,我需要允许用户通过滑动刷新数据。发生这种情况时,应用程序应检查是否可以使用当前连接,如果不能使用,则应安排作业。

当前,我正在将这项工作(检查当前连接和最终的作业调度)委托给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()
    }
}

然后该活动将能够从帮助程序方法(该方法处理swiper刷新事件)中调用该方法:

private fun recoverDataForTabs(swiper: SwipeRefreshLayout? = null){
    _swiper = swiper //for clearing
    _viewModel.tryToRefreshDataFromService()
}

但是,seems这样的想法实在是一个坏主意,因为ViewModels似乎对Android框架类一无所知(在这种情况下最终是必需的)。那么,这是否意味着我应该更新我的代码,以便从活动中进行网络检查和作业计划?

谢谢

1 个答案:

答案 0 :(得分:0)

您可以将与框架相关的对象插入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()
        }
    }
}