Что такое LiveData? Какие виды знаете?android-61

LiveData: Определение

LiveData — это класс из Android Architecture Components, который представляет собой observable-холдер данных. Он следует принципам жизненного цикла (Lifecycle-aware), что означает автоматическую подписку и отписку от обновлений данных в зависимости от состояния жизненного цикла компонента (например, Activity или Fragment).

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

  1. Lifecycle-aware: Автоматически управляет подписками, учитывая жизненный цикл.
  2. Observer Pattern: Уведомляет наблюдателей (Observers) при изменении данных.
  3. Нет утечек памяти: Отписывается, когда жизненный цикл владельца уничтожается.
  4. Консистентность данных: Наблюдатель всегда получает актуальные данные при возобновлении (например, после поворота экрана).

Виды LiveData

1. MutableLiveData

Базовый вариант, где данные можно изменять. Используется для обновления значений "на лету".

val liveData = MutableLiveData<String>()
liveData.value = "Hello, World!"  // Изменение данных

2. MediatorLiveData

Позволяет объединять несколько источников LiveData в один. Например, для комбинации данных из разных репозиториев.

val mediator = MediatorLiveData<String>()
val source1: LiveData<String> = MutableLiveData("Source 1")
val source2: LiveData<String> = MutableLiveData("Source 2")

mediator.addSource(source1) { value -> mediator.value = value }
mediator.addSource(source2) { value -> mediator.value = value }

3. Transformations.map

Преобразует данные одной LiveData в другой формат. Например, преобразование Int в String.

val originalLiveData = MutableLiveData<Int>(42)
val transformedLiveData = Transformations.map(originalLiveData) { it.toString() }

4. Transformations.switchMap

Полезен для сценариев, где нужно динамически переключаться между разными LiveData. Например, при поиске с изменяемым запросом.

val searchQuery = MutableLiveData<String>()
val searchResults = Transformations.switchMap(searchQuery) { query ->
    repository.search(query)
}

5. Custom LiveData

Можно создать свою реализацию, например, для работы с сенсорами или WebSockets, переопределив методы onActive() и onInactive().

class SensorLiveData(context: Context) : LiveData<Float>() {
    private val sensorManager = context.getSystemService(SENSOR_SERVICE) as SensorManager
    private val sensorListener = object : SensorEventListener {
        override fun onSensorChanged(event: SensorEvent?) {
            event?.let { value = it.values[0] }
        }
        override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {}
    }

    override fun onActive() {
        sensorManager.registerListener(sensorListener, ...)
    }

    override fun onInactive() {
        sensorManager.unregisterListener(sensorListener)
    }
}

Резюмируем

  • LiveData — это lifecycle-aware observable-холдер данных.
  • Основные виды: MutableLiveData, MediatorLiveData, Transformations.map/switchMap, кастомные реализации.
  • Используется для безопасной работы с UI, избегая утечек памяти и ручных подписок.