问题描述
我有一个工作 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。检查下图:
如您所见,它描述了数据驱动的通信流程,并且如您所说,ViewModel 将调用获取数据的存储库函数。然后,ViewModel 将为 Activity 提供可观察的变量和/或函数(例如:LiveData),并触发 Activity 将采取的事件以在 UI 中进行状态更改/数据呈现(这是调用反应模式)。
您应该查看以下 Codelab(来自 Google 的免费课程):Incorporate Lifecycle-Aware Components 和 Android Room with a View - Kotlin(虽然它主要涵盖 Room Library,但 Codelab 使用了 Google 推荐的 ViewModel 和 Android 最佳实践)。此外,您可以查看这篇文章:ViewModels and LiveData: Patterns + AntiPatterns。
我可以编写很多代码,但我认为这超出了本答案的范围。我也在学习,我的方法是首先了解这些东西是如何工作的,以及为什么将这些东西称为“最佳实践”。