Назад к вопросам
Junior
106
questionbank

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

Sobes Copilot

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

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

sobes.tech AI

ViewModel хранит и управляет UI-связанными данными c учетом жизненного цикла. Он переживает изменения конфигурации (повороты экрана, изменения раскладки), предотвращая потерю данных.

Ключевые особенности:

  • Сохранение данных: ViewModel не уничтожается при изменениях конфигурации, сохраняя состояние UI.
  • Отделение логики от UI: Бизнес-логика помещается в ViewModel, что упрощает тестирование и поддержку Activity/Fragment.
  • Интеграция с LiveData: Часто используется с LiveData для наблюдения за изменениями данных.

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

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Данные, которые нужно сохранить при изменении конфигурации
    var counter = 0
}
// MyActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider

class MyActivity : AppCompatActivity() {
    private lateinit var viewModel: MyViewModel
    private lateinit var counterText: TextView
    private lateinit var incrementButton: Button

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

        // Получение ViewModel
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        counterText = findViewById(R.id.counter_text)
        incrementButton = findViewById(R.id.increment_button)

        // Отображение данных из ViewModel
        updateCounterDisplay()

        incrementButton.setOnClickListener {
            viewModel.counter++
            updateCounterDisplay()
        }
    }

    private fun updateCounterDisplay() {
        counterText.text = viewModel.counter.toString()
    }
}

Срок жизни: ViewModel живет до тех пор, пока жив связанный с ним Scope (например, Activity). При завершении Scope ViewModel уничтожается.

ViewModelProviders (сейчас ViewModelProvider) использовался для получения экземпляра ViewModel до Kotlin. В Kotlin рекомендуется использовать ViewModelProvider(this).get(MyViewModel::class.java).

Основные преимущества ViewModel перед обычными классами для хранения UI-состояния:

  • Переживает изменения конфигурации.
  • Управляется фреймворком жизненного цикла Jetpack.

Недостатки:

  • Может стать слишком большой при сложной UI-логике.
  • Не должен содержать ссылок на View, Context или другие объекты с жизненным циклом, чтобы избежать утечек памяти.