gpt4 book ai didi

android - 如何编写一个使用 Context 从 Android 框架中检索数据的用例

转载 作者:行者123 更新时间:2023-12-03 11:01:40 26 4
gpt4 key购买 nike

我正在将应用程序迁移到 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com