Как написать сценарий использования, который извлекает данные из android Framework с Context - PullRequest
0 голосов
/ 28 января 2020

Я переносу приложение в MVVM и чистую архитектуру, и мне не хватает одной части pazzel

проблемной области:

перечисление всех приложений на устройстве и отобразить их (фрагмент / действие)

приложение устройства представлено его именем пакета:

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 () должен выполняться в UseCase внутри Domain Layer , который вызывается из ViewModel

, однако listAllApplications () получает Context и Уровень домена должен быть простым кодом

в чистой архитектуре / MVVM, в который следует поместить listAllApplications (context)

и в более общем смысле, как ViewModel должен взаимодействовать с android API-интерфейсами инфраструктуры, которые требуют Контекст (местоположение, et c.)?

1 Ответ

2 голосов
/ 28 января 2020

Уровень домена должен быть только простым кодом.

Это верно! , но, на мой взгляд, это частично правильно. Теперь, учитывая ваш сценарий, вам нужно context на уровне домена. У вас не должно быть context на уровне домена, но при необходимости вам следует либо выбрать другой шаблон архитектуры, либо рассматривать его как исключительный случай, когда вы делаете это.

Учитывая, что вы используете контекст в домене, Вы всегда должны использовать applicationContext, несмотря на activity context, потому что ранее процесс сохраняется в течение всего процесса.

Как ViewModel должен взаимодействовать с android API-интерфейсами платформы, которые требуют Context (location, et c.)?

Всякий раз, когда вам нужно Context в ViewModel, вы можете предоставить его из пользовательского интерфейса в качестве параметра метода (т.е. viewModel.getLocation(context)) или еще используйте AndroidViewModel в качестве родительского класса для ViewModel (он предоставляет getApplication() publi c метод для доступа к контексту через нашу ViewModel) .

Все, на что я хотел бы указать вы уверены, что вы случайно не удерживаете любой View / Context глобально внутри ViewModel / Domain Layer, потому что это может привести к катастрофе, такой как утечка памяти или сбои в худшем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...