LiveData — это класс из Android Architecture Components, который представляет собой observable-холдер данных. Он следует принципам жизненного цикла (Lifecycle-aware), что означает автоматическую подписку и отписку от обновлений данных в зависимости от состояния жизненного цикла компонента (например, Activity или Fragment).
Базовый вариант, где данные можно изменять. Используется для обновления значений "на лету".
val liveData = MutableLiveData<String>()
liveData.value = "Hello, World!" // Изменение данных
Позволяет объединять несколько источников 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 }
Преобразует данные одной LiveData в другой формат. Например, преобразование Int
в String
.
val originalLiveData = MutableLiveData<Int>(42)
val transformedLiveData = Transformations.map(originalLiveData) { it.toString() }
Полезен для сценариев, где нужно динамически переключаться между разными LiveData. Например, при поиске с изменяемым запросом.
val searchQuery = MutableLiveData<String>()
val searchResults = Transformations.switchMap(searchQuery) { query ->
repository.search(query)
}
Можно создать свою реализацию, например, для работы с сенсорами или 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)
}
}
MutableLiveData
, MediatorLiveData
, Transformations.map/switchMap
, кастомные реализации.