Пишу простенькое приложение на 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?