Добавить один и тот же Observer несколько раз в LiveData

Наша команда использует компоненты ViewModel и LiveData при разработке текущего Приложения. В одном из сценариев при Button щелчке мы инициируем вызов сетевого API.

Repository возвращает LiveData всякий раз, когда доступны результаты API.

В ViewModel мы присоединяем Observer только при щелчке по Button, а поскольку мы находимся в ViewModel, мы используем observeForever()

Это код;


//ViewModel Code


//Api Observer
 var apiObserver: Observer<ApiState> =
            Observer { response ->

                when (response.currentState) {

                    StateConstants.STATE_API_CALLED -> showLoading()
                    StateConstants.STATE_API_COMPLETE -> stopLoading()
                    StateConstants.STATE_DATA_LOADED -> processResponseData(response.data)
                    StateConstants.STATE_API_ERROR -> showError(response.errorMessage)

                }
            }


fun sendReminderToCustomer() { //This method is called on Button click from XML

        repo.apiStateLiveData.observeForever(apiObserver) //attach Observer and Observe Forever
        repo.sendReminderDetails() //make api call 

    }

override fun onCleared() {
        super.onCleared()
        repo.apiStateLiveData.removeObserver(apiObserver) //remove Observer
    }

Поскольку при каждом нажатии кнопки мы присоединяем того же наблюдателя к LiveData, будут ли какие-либо неизвестные побочные эффекты, например,

  1. Будет ли один и тот же наблюдатель добавляться в список LiveData наблюдателей несколько раз?
  2. Если один и тот же наблюдатель добавлен несколько раз, будет ли метод onChanged() вызываться несколько раз?

person iCantC    schedule 18.05.2020    source источник
comment
взгляните на эту тему, может быть, это поможет stackoverflow.com/questions/ 59107330 /   -  person Jassem Ben Hamida    schedule 18.05.2020
comment
Практически каждый раз, когда у меня возникала идея наблюдать за моделью Forever в представлении, это оказывалось плохой идеей, и ее приходилось реорганизовывать.   -  person ror    schedule 19.05.2020


Ответы (1)


Да и да. Обязательно добавляйте наблюдателя только один раз (например, в init вашей viewModel)

person Alex Timonin    schedule 18.05.2020