我有一个Fragment
, 具有动态数量的自定义视图,由一个EditText
和一个组成Button
。我所做的是,每次用户在 中键入价格EditText
并单击 时Button
,我都会通过 ViewModel 发出 API 请求,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,但我仍然遇到同样的问题。
提前非常感谢!