【问题标题】:Android: Where to schedule a job?Android:在哪里安排工作?
【发布时间】:2019-06-16 01:41:21
【问题描述】:

我正在使用 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()
    }
}

Activity 将能够从辅助方法(处理 swiper 刷新事件)中调用该方法:

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

然而,seems 这样的做法确实是个坏主意,因为 ViewModel 似乎不应该知道任何有关 Android 框架类的信息(而这最终是本案例所必需的)。那么,这是否意味着我应该更新我的代码,以便从活动中完成网络检查+作业调度?

谢谢

【问题讨论】:

    标签: android android-livedata android-viewmodel


    【解决方案1】:

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

    【讨论】:

    • 你好。所以你是说把它抽象成一个接口,然后实现会保存与android相关的东西?
    • @Luis Abreu,是的。它不需要是一个接口,但我的观点是让视图模型调用一个方法而不知道它的实际实现。
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多