%20fadd57a39740482e985fdecdf8e072af/cover-jetpack-livedata.webp)
LiveData (Deprecated)
LiveData официально устарела и больше не поддерживается Google. Мигрируй на Flow.
| https://developer.android.com/reference/android/arch/lifecycle/LiveDataReactiveStreams |
LiveData
| https://d.android.com/reference/android/arch/lifecycle/LiveData |
Механизм для управления данными и их наблюдением в архитектурных компонентах (Jetpack). Обертка над данными, которая позволяет подписчикам автоматически получать обновления, когда данные изменяются.
class MyViewModel: ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
fun updateData(newData: String) {
_data.value = newData
}
}
viewModel.data.observe(viewLifecycleOwner) { data ->
textView.text = data
}MutableLiveData
| https://developer.android.com/reference/android/arch/lifecycle/MutableLiveData |
Изменяемая версия LiveData, позволяющая устанавливать новое значение с помощью методов setValue() или postValue().
class MyViewModel: ViewModel() {
val textData = MutableLiveData<String>()
fun updateText(newText: String) {
textData.value = newText // Устанавливаем новое значение
}
}MediatorLiveData
| https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData |
Позволяет объединять несколько источников LiveData и реагировать на изменения каждого из них.
class MyViewModel: ViewModel() {
val source1 = MutableLiveData<Int>()
val source2 = MutableLiveData<Int>()
val combinedData = MediatorLiveData<Int>().apply {
addSource(source1) { value1 ->
value = value1 * 2
}
addSource(source2) { value2 ->
value = value2 + 10
}
}
}observe
Подписывается на изменения данных. Observer будет получать уведомления при каждом изменении значения в LiveData, если LifecycleOwner находится в активном состоянии (STARTED или RESUMED).
viewModel.textData.observe(viewLifecycleOwner) { text ->
textView.text = text
}observeForever
Подписывается на изменения данных без привязки к жизненному циклу, независимо от состояния LifecycleOwner.
val liveData = MutableLiveData<String>()
val observer = Observer<String> { value ->
println("Значение изменилось: $value")
}
liveData.observeForever(observer)removeObserver
Удаляет наблюдателя и прекращает отправку уведомлений об изменениях данных. Используется для отписки, особенно если подписка была выполнена через observeForever().
liveData.removeObserver(observer)removeObservers
Удаляет всех наблюдателей, связанных с указанным LifecycleOwner.
liveData.removeObservers(viewLifecycleOwner)postValue
Асинхронно обновляет значение в LiveData. Используется для изменения значения из фоновых потоков.
val liveData = MutableLiveData<String>()
Thread {
liveData.postValue("Новое значение")
}.start()setValue
Синхронно устанавливает новое значение в LiveData. Используется только в основном потоке.
val liveData = MutableLiveData<String>()
liveData.setValue("Новое значение")getValue
Возвращает текущее значение из LiveData. Возвращает null, если значение еще не установлено.
val liveData = MutableLiveData<String>()
liveData.value = "Пример"
val currentValue = liveData.getValue() // Вернет "Пример"liveData
Cоздает объект LiveData и позволяет использовать корутины для выполнения асинхронных операций внутри нее.
val value = liveData {
emit("Загрузка данных...")
delay(1000) // Имитируем асинхронную задачу
emit("Данные загружены")
}asLiveData
Преобразует поток Flow в LiveData.
val flow = flow {
emit("Данные из потока")
}
val liveData = flow.asLiveData()SingleLiveEvent
Обертка над LiveData, предназначенная для событий, которые должны быть обработаны один раз, например, для навигации или отображения сообщений. Решает проблему повторного отправления данных при пересоздании UI (например, при повороте экрана).
class SingleLiveEvent<T>: MutableLiveData<T>() {
private val pending = AtomicBoolean(false)
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
super.observe(owner) { value ->
// Уведомляем наблюдателя, только если значение было изменено и не обработано ранее
if (pending.compareAndSet(true, false)) {
observer.onChanged(value)
}
}
}
override fun setValue(value: T?) {
pending.set(true)
super.setValue(value)
}
// Удобный метод для отправки событий из фонового потока
fun call() {
value = null
}
}class MyViewModel: ViewModel() {
val event = SingleLiveEvent<String>()
fun triggerEvent() {
event.value = "Событие произошло"
}
}
viewModel.event.observe(viewLifecycleOwner) { message ->
println(message) // Выведет "Событие произошло" только один раз
}Transformations
map
Позволяет преобразовать значение LiveData.
val source = MutableLiveData<Int>()
val mapped = source.map { it * 2 }
mapped.observe(viewLifecycleOwner) { value ->
println(value)
}switchMap
Используется для переключения на новую LiveData, основанную на значении исходной LiveData.
val source = MutableLiveData<String>()
val switched = source.switchMap { query ->
liveData { emit("Результат для: $query") }
}
switched.observe(viewLifecycleOwner) { result ->
println(result)
}distinctUntilChanged
Отправляет обновления только при изменении значения.
val source = MutableLiveData<Int>()
val distinct = source.distinctUntilChanged()
distinct.observe(viewLifecycleOwner) { value ->
println(value) // Повторные значения игнорируются
}