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