Это нормально, чтобы вызвать наблюдаемForever () на Livedata, возвращаемых Transformations.map () внутри ViewModel? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытался использовать LiveData Transformations.map () для проверки результата и обновления пользовательского интерфейса.Но обратный вызов Transformations.map () не срабатывает без наблюдателя.

Так это хороший способ для вызова observeForever {} в liveata, возвращаемых Tranformations.map?И удалить оберверы на onCleared на ViewModel?

private lateinit var map: LiveData<Unit>

    fun getAppConfiguration(): MutableLiveData<TopRatedMoviesResponse> {
        progressDialogVisibleLiveData.postValue(true)

        val appConfigurationLiveData = MutableLiveData<TopRatedMoviesResponse>()

        val appConfigurationSourceLiveData : MutableLiveData<DataResult> = splashScreenRepository.getAppConfiguration(getApplication())

        map = Transformations.map(appConfigurationSourceLiveData) { dataResult ->
            progressDialogVisibleLiveData.postValue(false)

            when (dataResult) {
                is DataResultSuccess -> {
                    appConfigurationLiveData.postValue(dataResult.data as TopRatedMoviesResponse)
                }

                is DataResultFailed -> {
                    when (dataResult.errorCode) {
                        HTTPError.NO_INTERNET -> {
                            errorDialogVisibleLiveData.postValue(dataResult)
                        }

                        HTTPError.BAD_REQUEST -> {
                            errorDialogVisibleLiveData.postValue(dataResult)
                        }

                        HTTPError.UNAUTHORISED -> {
                            unAuthorisedEventLiveData.postValue(true)
                        }

                        HTTPError.FORBIDDEN, HTTPError.NOT_FOUND, HTTPError.INTERNAL_SERVER_ERROR, HTTPError.UNKNOWN -> {
                            errorDialogVisibleLiveData.postValue(dataResult)
                        }
                    }
                }
            }
        }
        map.observeForever {  }

        return appConfigurationLiveData
    }

    override fun onCleared() {
        super.onCleared()

        map.removeObserver {  }
    }

1 Ответ

0 голосов
/ 15 февраля 2019

Но обратный вызов Transformations.map не запускается без наблюдателя.

Это нормально, без вызова метода ObserverForever () LiveData, возвращаемого Transformations.map (), никто не можетПредложите данные, которые в нем хранятся.

Так что это хороший способ вызвать Наблюдение за {{} при использовании живых данных, возвращаемых Tranformations.map?

Просмотр того, что вы делаете в этомМетод, ответ нет, это не то, как вы используете Transformations.map ().Цель этого метода - применить некоторые изменения к значениям, исходящим от исходного LiveData, до того, как эти значения будут представлены наблюдателю.В вашем случае вам нужно простое изменение типа (от dataResult.data до TopRatedMoviesResponse), а также запуск некоторой ошибки LiveDatas, когда что-то пошло не так.Проверьте приведенный ниже код:

fun getAppConfiguration(): MutableLiveData<TopRatedMoviesResponse> {
    progressDialogVisibleLiveData.postValue(true)
    val appConfigurationSourceLiveData : MutableLiveData<DataResult> = splashScreenRepository.getAppConfiguration(getApplication())
    return Transformations.map(appConfigurationSourceLiveData) { dataResult ->
            progressDialogVisibleLiveData.postValue(false)
            when (dataResult) {
                is DataResultSuccess -> {
                    dataResult.data as TopRatedMoviesResponse
                }
                is DataResultFailed -> {
                    when (dataResult.errorCode) {                        
                        HTTPError.UNAUTHORISED -> {
                            unAuthorisedEventLiveData.postValue(true)
                        }
                        HTTPError.FORBIDDEN, HTTPError.NOT_FOUND, HTTPError.INTERNAL_SERVER_ERROR, HTTPError.UNKNOWN, HTTPError.NO_INTERNET, HTTPError.BAD_REQUEST -> {
                            errorDialogVisibleLiveData.postValue(dataResult)
                        }
                    }
                    // we have to return something even if an error occured
                    // I'm returning null, your UI should handle this
                    null 
                }                   
            }
     }
}

Также ознакомьтесь с руководством по архитектуре , чтобы найти альтернативные способы обработки данных и ошибок с помощью LiveData.

...