Tsudzukeru
@Tsudzukeru

Как реализовать мониторинг состояний сетевых запросов в MVVM?

Пишу простенькое приложение на MVVM.
Во ViewModel есть поле типа LiveData куда я помещаю значение полей своего класса-маркера состояний NetworkState.

Он выглядит вот так:
enum class Status {
    WAITING,
    RUNNING,
    SUCCESS,
    FAILED
}

class NetworkState(val status: Status, val msg: String) {

    companion object {
        val WAITING:NetworkState
        val LOADED: NetworkState
        val LOADING: NetworkState
        val ERROR: NetworkState
        val API_LIMIT_EXCEEDED: NetworkState
        val NO_INTERNET:NetworkState

        init {
            WAITING = NetworkState(Status.WAITING,"Waiting user request")
            LOADED = NetworkState(Status.SUCCESS, "Success")
            LOADING = NetworkState(Status.RUNNING, "Running")
            ERROR = NetworkState(Status.FAILED, "Something went wrong")
            API_LIMIT_EXCEEDED = NetworkState(Status.FAILED, "API limit exceeded")
            NO_INTERNET = NetworkState(Status.FAILED,"No internet connection")
        }
    }
}


Например если пользователь не включил интернет, то после отлова ошибки произойдет следующее:

_networkState.postValue(NetworkState.NO_INTERNET)
            _networkState.postValue(NetworkState.WAITING)


Сначала я кладу в LiveData значение NetworkState.NO_INTERNET, что вызывает коллбек на слушателе _networkState и полявляется DialogFragment с ошибкой.
Во второй строчке кода - меняю состояние _networkState LiveData на NetworkState.WAITING, указывая тем самым что приложение пришло в начальное состояние и ожидает действий пользователя.

Так вот. Это работает через раз. Я последовательно меняю значение LiveData и иногда случается, что второе значение NetworkState.WAITING не долетает до LiveData, что ломает логику работы моего приложения.(ProgressBar бесконечно крутится). Почему так происходит? Делаю по примеру чужого кода. Вообще правильно ли отслеживать состояния приложения во ViewModel?
  • Вопрос задан
  • 44 просмотра
Решения вопроса 1
@Dmtm
Android
потому что такая реализация postValue, значения доставляются в главном потоке, пока текущее не доставлено - последующие игнорируются
LiveData вообще сомнительное решение, лучше использовать ObservableField
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы