Каким образом реализовать передачу зависимостей через контекст внутри ViewModel?

В Android ViewModel обычно не рекомендуется напрямую хранить или использовать Context, чтобы избежать утечек памяти. Однако, если нужно передать зависимости через контекст, можно использовать следующие подходы:

Короткий ответ

Что ответить на собеседовании

В Android ViewModel обычно не рекомендуется напрямую хранить или использовать Context, чтобы избежать утечек памяти. Однако, если нужно передать зависимости через контекст, можно использовать следующие подходы:

Подробный разбор

Ответ с пояснениями

В Android ViewModel обычно не рекомендуется напрямую хранить или использовать Context, чтобы избежать утечек памяти. Однако, если нужно передать зависимости через контекст, можно использовать следующие подходы:

  • Передача Application Context: Наследовать ViewModel от AndroidViewModel, который предоставляет доступ к Application Context.
class MyViewModel(application: Application) : AndroidViewModel(application) {
    private val context = getApplication<Application>().applicationContext
    // Используйте context для доступа к ресурсам или системным сервисам
}
  • Использование Dependency Injection: Передавать необходимые зависимости в конструктор ViewModel через фабрику.
class MyViewModel(private val repository: MyRepository) : ViewModel() {
    // Логика ViewModel
}

class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            return MyViewModel(repository) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

Таким образом, контекст используется аккуратно, а зависимости передаются явно, что улучшает тестируемость и предотвращает утечки памяти.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку