我有一个图表片段和一个开关。在选择开关时,需要再次使用新值来命中API,并且需要更新图表,API代码如下所示:
private fun hitSecondChartApi(country: String, category: String, market: String, weightKpi: String) {
userModel.getResponseShareSecondChartData(country, category, market, weightKpi)
Log.e(TAG, "Inside hitsecondchartapi: "+ country+":"+category+":"+market+":"+weightKpi)
userModel.responseSecondChartData.observe(this,
Observer {
Log.e(TAG, "Second chart data: " + it.toString())
Utils.debugger("FRAG ", "$it")
secondChartData = it!!
if (it.size > 0) {
splitSecondParentList(it!!)
} else
Utils.showLongToast(requireActivity(), "No Data for Distribution")
// userModel.responseSecondChartData.removeObservers(this)
})
}
现在这里的问题是“ 观察者在我打开/关闭开关时正在运行多次,并且还先向我提供了先前的API请求的值,然后又向我提供了当前API的值”例如,响应是当我将开关关闭时,我仍然收到“打开”状态的信息,反之亦然。它像一个堆栈。
例如:开关打开:响应关闭->响应关闭->响应打开->响应打开->响应打开
开关关闭:响应打开->响应打开->响应关闭->响应关闭->响应关闭
作为一种解决方法,我试图删除观察者,您也可以在上面的代码的注释行中看到该观察者,但是它有一个缺陷,因为它只会运行一次,因此我可能会也可能不会从中获得当前的API响应。
我可以做的一件事就是过滤掉响应,但是我需要针对此问题进行适当的修复,我应该只接收当前的API响应,应该只运行一次,因为我无法过滤掉响应。其他API。
所以请帮助我解决此问题。
每次调用hitSecondChartApi()
时,都会向LiveData
附加新的观察者,并且这些重复的观察者正在导致意外结果。 SingleEvent
或SingleLiveData
之类的解决方案可以从技术上隐藏此效果,但不能消除根本原因。
正确的解决方法是在responseSecondChartData
/ Fragment
初始化的开始仅调用Activity
。例如:
fun onActivityCreated(...) {
userModel.responseSecondChartData.observe(this,
Observer {
Log.e(TAG, "Second chart data: " + it.toString())
Utils.debugger("FRAG ", "$it")
secondChartData = it!!
if (it.size > 0) {
splitSecondParentList(it!!)
} else
Utils.showLongToast(requireActivity(), "No Data for Distribution")
})
}
private fun hitSecondChartApi(country: String, category: String, market: String, weightKpi: String) {
userModel.getResponseShareSecondChartData(country, category, market, weightKpi)
}
不需要在上面的代码中删除观察者,因为它仅创建一个观察者。