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,这些重复的观察者会导致意外的结果。 SingleEventSingleLiveData 等解决方案在技术上可以隐藏这种影响,但不会消除根本原因。

正确的解决方案是在 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)
}

上面代码中不需要删除观察者,因为它只创建了一个观察者。