Назад к вопросам
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
}
}