如何编写一个用例从上下文中从android框架中检索数据

问题描述 投票:0回答:1

我正在将应用程序迁移到MVVM和干净的体系结构,而我却失去了其中的一部分

问题域:

列出设备上的所有应用程序并显示它们(碎片/活动)

设备应用程序由其包名称表示:

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调用的Domain Layer内的UseCase中完成

但是listAllApplications()接收上下文,并且域层应仅是纯代码

在干净的体系结构/ MVVM中,我应该将listAllApplications(context)放在哪一层

更一般而言,ViewModel应该如何与需要上下文(位置等)的android框架API进行交互?

android mvvm use-case android-mvvm clean-architecture
1个回答
2
投票

域层应仅是纯代码。

没错!

,但我认为这是部分正确的。现在考虑您的方案,您需要在域级别使用context。您不应该在域级别使用context,但是在需要时,您应该选择其他体系结构模式,或者将其视为执行此操作的特殊情况。考虑到您在域中使用上下文,尽管applicationContext,您仍应始终使用activity context,因为更早的过程会持续进行整个过程。

ViewModel应该如何与需要上下文(位置等)的android框架API进行交互?

[无论何时需要在ViewModel上使用Context,您都可以从UI作为方法参数

(即viewModel.getLocation(context))]提供它,或者将AndroidViewModel用作ViewModel的父类(它提供[ C0]通过ViewModel访问上下文的公共方法)我想向您指出的是,请确保不要在ViewModel / Domain层内意外地全局保存任何View / Context,因为它可能造成灾难,例如内存泄漏或崩溃,甚至更糟。

© www.soinside.com 2019 - 2024. All rights reserved.