Назад к вопросам
Middle
68
questionbank

В чем различие между ViewModel и OnSavedInstanceState в Android?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

ViewModel переживает изменения конфигурации (смена ориентации, языка), сохраняя данные. Жизненный цикл ViewModel связан с жизненным циклом Activity или Fragment, но переживает их пересоздание.

OnSavedInstanceState является частью жизненного цикла Activity или Fragment. Он используется для сохранения небольшого объема данных перед уничтожением компонента (например, при нехватке памяти или изменении конфигурации). Данные сохраняются в Bundle.

Основные отличия:

  • Жизненный цикл: ViewModel переживает изменения конфигурации, OnSavedInstanceState — нет.
  • Объем данных: ViewModel предназначен для хранения данных, необходимых в течение всего жизненного цикла UI-контроллера. OnSavedInstanceState — для сохранения небольшого состояния.
  • Место хранения: ViewModel хранится в специальном хранилище, предоставляемом Architecture Components. OnSavedInstanceState сохраняет данные в Bundle, который затем восстанавливается при создании UI-контроллера.
  • Назначение: ViewModel предназначен для UI-логики и данных, переживающих изменения конфигурации. OnSavedInstanceState — для сохранения пользовательского состояния на момент уничтожения компонента.
Критерий ViewModel OnSavedInstanceState
Переживает изменения конфигурации? Да Нет
Типичный объем данных Достаточно большой Небольшой
Механизм хранения Специальное хранилище Architecture Components Bundle
Основное назначение UI-логика и данные Сохранение состояния пользовательского интерфейса

Пример использования ViewModel:

// MyViewModel.kt
class MyViewModel : ViewModel() {
    val data: MutableLiveData<String> by lazy {
        MutableLiveData<String>()
    }

    init {
        // Загрузка данных
        data.value = "Начальные данные"
    }
}

Пример использования OnSavedInstanceState:

// MyAcvitity.kt
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("savedText", textView.text.toString())
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    if (savedInstanceState != null) {
        val savedText = savedInstanceState.getString("savedText")
        textView.text = savedText
    }
}