我正在将应用程序迁移到 MVVM 和干净的架构,但我错过了难题的一部分。
问题域:
列出设备上的所有应用程序并在 Fragment/Activity 中显示它们
设备应用程序由其包名称表示:data class DeviceApp(val packageName: String)
这是列出设备应用程序的方式:
private fun listAllApplications(context: Context): List<DeviceApp> {
val ans = mutableListOf<DeviceApp>()
val packageManager: PackageManager = context.applicationContext.packageManager
val packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
for (applicationInfo in packages) {
val packageName = applicationInfo.packageName
ans.add(DeviceApp(packageName))
}
return ans
}
据我了解,调用listAllApplications()
应该在“域层”内的用例中完成,由 ViewModel
调用.然而
listAllApplications
收到 Context
,并且域层应该只是纯代码。在干净的架构/MVVM 中,我应该在哪一层放置
listAllApplications(context)
?更一般地说,ViewModel 应该如何与需要
Context
的 Android 框架 API 交互(位置等)?
最佳答案
Domain Layer should be plain code only.
这是正确的! ,但在我看来它是部分正确的。现在考虑您需要的场景
context
在域级别。你不应该有 context
在域级别,但根据您的需要,您应该选择其他架构模式或将其视为您正在执行此操作的异常(exception)情况。考虑到您在域中使用上下文,您应该始终使用
applicationContext
尽管 activity context
,因为较早的过程会持续存在。How should the ViewModel interact with android framework APIs that require Context (location, etc.)?
随时需要
Context
在 ViewModel 中,您可以从 UI 作为方法参数(即 viewModel.getLocation(context)
)提供它,或者使用 AndroidViewModel
作为 ViewModel
的父类(它提供了 getApplication()
公共(public)方法来通过 ViewModel 访问上下文)。我想向您指出的是,请确保您不会意外地在 ViewModel/Domain Layer 中全局持有任何 View/Context,因为它可能会导致内存泄漏或崩溃等灾难更严重。
关于android - 如何编写一个使用 Context 从 Android 框架中检索数据的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59946485/