Sobes.tech
Junior
131
questionbank

Расскажи о Jetpack ViewModel.

Answer from AI

sobes.tech AI

ViewModel — это компонент Jetpack, предназначенный для хранения и управления данными UI-связанным способом. Его основная цель — сохранять данные UI во время изменений конфигурации, таких как поворот экрана, и переживать жизненный цикл Activity или Fragment.

Особенности ViewModel:

  • Сохранение данных: Переживает изменения конфигурации и даже смерть Activity/Fragment, восстанавливая данные при пересоздании.
  • Отделение логики: Отделяет логику подготовки данных для UI от самого UI (Activity/Fragment).
  • Лайфсайкл-оруженность: Связан с жизненным циклом Activity или Fragment.
  • Исключение утечек памяти: Не имеет прямой ссылки на View, Lifecycle или Activity/Fragment, что предотвращает утечки памяти.

Как использовать:

  1. Создайте класс, наследующий ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Инициализация данных
        }
    
        fun fetchData() {
            // Логика загрузки данных
            _data.value = "Загруженные данные"
        }
    
        override fun onCleared() {
            // Очистка ресурсов
            super.onCleared()
        }
    }
    
  2. Получите экземпляр ViewModel в Activity или Fragment.

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    
            viewModel.data.observe(this, Observer { newData ->
                // Обновление UI
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Используйте ViewModelProvider.Factory для создания экземпляров ViewModel с зависимостями.

    class MyViewModel(private val repository: MyRepository) : ViewModel() {
        // ...
    }
    
    class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
                @Suppress("UNCHECKED_CAST")
                return MyViewModel(repository) as T
            }
            throw IllegalArgumentException("Unknown ViewModel class")
        }
    }
    
    // В Activity/Fragment
    // val repository = MyRepository() // Инъекция зависимости
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Сравнение с onSaveInstanceState():

Характеристика ViewModel onSaveInstanceState()
Переживание конфиг. изм. Да Да (для небольших объемов данных)
Переживание процесса Нет (после уничтожения процесса данные теряются) Да (для небольших объемов данных)
Хранение данных Объекты, LiveData Bundle (примитивы, Serializable, Parcelable)
Утечки памяти Нет (при правильном использовании) Возможно при хранении ссылок на Activity/View
Сложность реализации Сложнее для простых сценариев Проще для простых сценариев

ViewModel помогает создавать более устойчивые и легко тестируемые приложения, отделяя UI от логики обработки данных.