ViewModel 观察 运行 一次点击 API 多次
ViewModel observe is running multiple times for a single hit to API
我有一个片段中的图表和一个开关。在选择开关时,需要再次点击 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)
})
}
现在的问题是“Observer 在我转动 ON/OFF 开关时多次 运行ning 并且它还为我提供了之前 API 首先请求当前 API" 例如,当我关闭开关时,我在开关打开状态下收到的响应仍然会再次收到,反之亦然。它就像一个堆栈。
例如:开关开启:响应关闭->响应关闭->响应开启->响应开启->响应开启
开关关闭:响应开启->响应开启->响应关闭->响应关闭->响应关闭
作为一种解决方法,我尝试删除观察者,您也可以在上面代码的注释行中看到它,但它有一个缺陷,因为它只会 运行 一次,我可能会也可能不会得到当前的API 来自它的回应。
我能做的一件事是过滤掉响应,但我需要对这个问题进行适当的修复,我应该只接收当前的 API 响应,因为它应该 运行 只接收一次我将无法过滤掉其他 API。
所以请帮我解决这个问题。
每次调用 hitSecondChartApi()
时,都会有一个新的观察者附加到 LiveData
,这些重复的观察者会导致意外的结果。 SingleEvent
或 SingleLiveData
等解决方案在技术上可以隐藏这种影响,但不会消除根本原因。
正确的解决方案是在 Fragment
/Activity
初始化开始时只调用一次 responseSecondChartData
。例如:
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)
}
上面代码中不需要删除观察者,因为它只创建了一个观察者。
我有一个片段中的图表和一个开关。在选择开关时,需要再次点击 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)
})
}
现在的问题是“Observer 在我转动 ON/OFF 开关时多次 运行ning 并且它还为我提供了之前 API 首先请求当前 API" 例如,当我关闭开关时,我在开关打开状态下收到的响应仍然会再次收到,反之亦然。它就像一个堆栈。
例如:开关开启:响应关闭->响应关闭->响应开启->响应开启->响应开启
开关关闭:响应开启->响应开启->响应关闭->响应关闭->响应关闭
作为一种解决方法,我尝试删除观察者,您也可以在上面代码的注释行中看到它,但它有一个缺陷,因为它只会 运行 一次,我可能会也可能不会得到当前的API 来自它的回应。
我能做的一件事是过滤掉响应,但我需要对这个问题进行适当的修复,我应该只接收当前的 API 响应,因为它应该 运行 只接收一次我将无法过滤掉其他 API。
所以请帮我解决这个问题。
每次调用 hitSecondChartApi()
时,都会有一个新的观察者附加到 LiveData
,这些重复的观察者会导致意外的结果。 SingleEvent
或 SingleLiveData
等解决方案在技术上可以隐藏这种影响,但不会消除根本原因。
正确的解决方案是在 Fragment
/Activity
初始化开始时只调用一次 responseSecondChartData
。例如:
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)
}
上面代码中不需要删除观察者,因为它只创建了一个观察者。