ViewModel观察针对API的一次点击多次运行

问题描述 投票:0回答:1

我有一个图表片段和一个开关。在选择开关时,需要再次使用新值来命中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。

所以请帮助我解决此问题。

android rx-java rx-android android-livedata observers
1个回答
0
投票

每次调用hitSecondChartApi()时,都会向LiveData附加新的观察者,并且这些重复的观察者正在导致意外结果。 SingleEventSingleLiveData之类的解决方案可以从技术上隐藏此效果,但不能消除根本原因。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.