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

标签 android mvvm use-case android-mvvm clean-architecture

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

相关文章:

c++ - Android NDK OpenGL ES 1.0 简单渲染

java - 使用 TCP 通过套接字发送字符串

android - 获取应用页面中的所有按钮

c# - MVVM - 是否有开源 View Model 基类?

uml - 有 "Non-Functional Use Case"这样的东西吗?

java - 如何使用 OKHTTP 取消请求

wpf - MVVM 与数据虚拟化

c# - 在 MVVM 中传递服务

oop - UML 和算法

inheritance - 用例中的扩展与泛化