【问题标题】:How to separate data handling from Activity如何将数据处理与 Activity 分开
【发布时间】:2021-01-17 16:55:52
【问题描述】:

我有一个工作 Activity (TwalksRouteActivity),它接受来自 bundle 的记录 id (routeID)(从 Fragment 传递),从我的存储库 (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()
    }
}

}

【问题讨论】:

    标签: android kotlin android-activity repository viewmodel


    【解决方案1】:

    你是对的。 Best practices 包含 ViewModel 的想法,它处理业务逻辑(您的存储库)与使用或/和显示数据的活动或片段之间的通信。您应该查看 Android Developers ViewModel 的官方文档:ViewModel Overview。还有guide to 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

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

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2021-04-07
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 2012-11-24
      相关资源
      最近更新 更多