Как остановить событие LiveData, которое запускалось более одного раза

Я использую MutableLiveData в своем приложении для связи на основе событий. У меня есть единственная активность двух фрагментов архитектуры.

С помощью ViewModel я использую события LiveData во фрагменте-1. Но когда я заменяю этот фрагмент-1 фрагментом-2 с помощью строки меню и, наконец, возвращаюсь к фрагменту-1, старые значения LiveData захватываются снова.

Как избежать этой проблемы? Любая помощь / предложения приветствуются! Спасибо.


person Ningan    schedule 14.02.2019    source источник


Ответы (4)


Вы можете использовать Event, чтобы обернуть LiveData значения для обработки потребления его значений, как в следующей статье: https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150

Класс события будет таким:

open class Event<out T>(private val content: T) {

    var hasBeenHandled = false
        private set // Allow external read but not write

    /**
     * Returns the content and prevents its use again.
     */
    fun getContentIfNotHandled(): T? {
        return if (hasBeenHandled) {
            null
        } else {
            hasBeenHandled = true
            content
        }
    }

    /**
     * Returns the content, even if it's already been handled.
     */
    fun peekContent(): T = content
}

Допустим, ваше значение LiveData - это строка, тогда LiveData отдельного события будет иметь вид:

val navigateToDetails = MutableLiveData<Event<String>>()

person Metwalli    schedule 14.02.2019
comment
Работает!! Спасибо:) - person Ningan; 15.02.2019

Где бы вы ни наблюдали liveData, в методе onChanged удалите наблюдателей, вызвав myLiveDataObject.removeObservers(this);. Это удалит наблюдателя после первого наблюдения данных.

person Kashish Sharma    schedule 14.02.2019

Проблема с принятым ответом в том, что у вас может быть только один наблюдатель. В этой статье описывается решение с несколькими наблюдателями.

person Darko Martinović    schedule 09.01.2020

Я столкнулся с той же проблемой и придумал эту библиотеку для ее решения https://github.com/ueen/LiveEvent Надеюсь, это поможет, наслаждайтесь!

person ueen    schedule 18.01.2020