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) // Повторные значения игнорируются
}