如何将数据处理与活动分开

问题描述

我有一个工作 Activity (TwalksRouteActivity),它接受来自包(从 Fragment 传递)的记录 ID (routeID),从我的存储库 (routesRepository) 中提取关联的记录,并传递关联的值/列 (routeName)到我的用户界面。这工作正常。但是,据我了解最佳实践(我正在学习 Android 开发),对我的存储库的调用应该在 viewmodel 中,而不是在 Activity 中。这样对吗?我已经尝试过,但自己没有做到这一点,非常感谢您在如何做到这一点方面得到一些帮助。

TwalksRouteActivity:

class TwalksRouteActivity() : AppCompatActivity()  {

private lateinit var viewmodel: Routeviewmodel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    //Log.i("CWM","Called viewmodelProvider")
    //viewmodel = viewmodelProvider(this).get(Routeviewmodel::class.java)

    var bundle: Bundle? = intent.extras
    var routeID = bundle?.getInt("routeID")

    lifecycleScope.launch (dispatchers.Main) {
        val database = getDatabase(application)
        val routesRepository = RoutesRepository(database)
        val selectedRoute = routesRepository.getRoute(routeID)
        val routeName = selectedRoute.routeName

        Log.d("CWM",routeName.toString())

        setContentView(R.layout.route_detail)

        val routeName_Text: TextView = findViewById(R.id.routeName_text)
        routeName_Text.text = routeName.toString()
        val routeID_Text: TextView = findViewById(R.id.routeID)
        routeID_Text.text = routeID.toString()
    }
}

}

解决方法

你说得对。 Best practices 包括处理业务逻辑(您的存储库)与使用或/和显示数据的活动或片段之间的通信的 ViewModel 的想法。您应该查看 Android Developers ViewModel 的官方文档:ViewModel Overview。还有guide to app architecture。检查下图:

App Architecture

如您所见,它描述了数据驱动的通信流程,并且如您所说,ViewModel 将调用获取数据的存储库函数。然后,ViewModel 将为 Activity 提供可观察的变量和/或函数(例如:LiveData),并触发 Activity 将采取的事件以在 UI 中进行状态更改/数据呈现(这是调用反应模式)。

您应该查看以下 Codelab(来自 Google 的免费课程):Incorporate Lifecycle-Aware ComponentsAndroid Room with a View - Kotlin(虽然它主要涵盖 Room Library,但 Codelab 使用了 Google 推荐的 ViewModel 和 Android 最佳实践)。此外,您可以查看这篇文章:ViewModels and LiveData: Patterns + AntiPatterns

我可以编写很多代码,但我认为这超出了本答案的范围。我也在学习,我的方法是首先了解这些东西是如何工作的,以及为什么将这些东西称为“最佳实践”。