У меня есть Fragment
с динамическим числом пользовательских представлений, состоящим из EditText
и Button
. Что я делаю, так это то, что каждый раз, когда пользователь вводит цену в EditText
и нажимает Button
, я делаю запрос API через ViewModel, и мой Fragment
наблюдает LiveData
в ViewModel
.
Пока все хорошо, когда я использую первый пользовательский вид. Проблема возникает во втором (и третьем), потому что метод onChanged()
, по-видимому, вызывается, даже если данные не изменились, а второе и третье пользовательские представления прослушивают эти данные, поэтому они изменяются, когда они НЕ являются те, которые запускают изменение данных (они получают изменение данных от первого).
Когда пользователь нажимает на Button
, я наблюдаю и получаю цену следующим образом:
val observer = Observer<NetworkViewState> { networkViewState ->
processResponse(networkViewState, moneySpent, coin, date)
}
boardingHistoricalPriceViewModel.coinDayAveragePrice.observe(this, observer)
boardingHistoricalPriceViewModel.getDayAveragePrice(coin.symbol,
addedCoinDatePriceView.selectedSpinnerItem, dateInMillis)
и что происходит, так это то, что метод processResponse
вызывается, когда второе пользовательское представление инициировало запрос API, но результат, который я получаю, - это тот, который coinDayAveragePrice
имеет до получения ответа API (это значение после первого ответа API от первого пользовательский вид прибыл).
Это часть моего ViewModel
:
val coinDayAveragePrice: MutableLiveData<NetworkViewState> = MutableLiveData()
fun getDayAveragePrice(symbol: String, currency: String, dateInMillis: Long) {
coinRepository
.getDayAverage(symbol, currency, "MidHighLow", dateInMillis)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { coinDayAveragePrice.postValue(NetworkViewState.Loading()) }
.subscribeBy(onSuccess = {
coinDayAveragePrice.postValue(NetworkViewState.Success(it))
}, onError = { throwable ->
coinDayAveragePrice.postValue(NetworkViewState.Error(throwable.localizedMessage))
})
}
NetworkViewState
— это просто sealed class
, предназначенный для обертки ответа на запрос API:
sealed class NetworkViewState {
class Loading : NetworkViewState()
class Success<out T>(val item: T) : NetworkViewState()
class Error(val errorMessage: String?) : NetworkViewState()
}
Я также пытался отказаться от подписки или установить для coinDayAveragePrice
значение null, но у меня все еще та же проблема.
Заранее большое спасибо!
LivaData<NetworkViewState> coinDayAveragePrice = ...
исходный код - person pskink   schedule 30.04.2018SingleLiveEvent
класс тоже не работает :( - person noloman   schedule 30.04.2018