小编Mic*_*ell的帖子

Livedata 观察者多次触发

我在用我的项目设置 MVVM 时遇到了麻烦,一切似乎都在顺利运行,除非我注意到我的 LiveData 对象的观察者被多次调用。有时为同一个 LiveData 对象更新一次 4-5 次。

主活动上托管了多个片段,所有片段都链接到连接到我的存储库的同一个 ViewModel,然后使用改造向我的服务器发出 API 请求。

然后我在每个片段中都有单独的观察者,观察来自 ViewModel 的相同 LiveData 对象的变化,当使用单个片段时,我没有对同一变化进行多次观察的问题,但是在将项目扩展为具有多个片段时我注意到观察者被称为很多。

我已将观察者更改为全部使用 viewLifecycleOwner 无济于事。

这是一个片段示例,每个片段在观察 LiveData 的方式上基本相同,只是它们更新 UI 的不同部分。

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this, viewModelFactory)
                .get(WeatherViewModel::class.java)
        bindUI()
    }

    private fun bindUI() = launch {
        val currentWeatherResponse = viewModel.weatherResponse.await()

        currentWeatherResponse.observe(viewLifecycleOwner, Observer {
            if(it == null) return@Observer
            Log.i("CurrentWeatherFragment", "Observed")
            val currentWeather = it.currentWeather.first()
            updateTemperature(currentWeather.temperature, currentWeather.tempMin, currentWeather.tempMax)
            updateWind(currentWeather.windSpeed, currentWeather.windDirName)
            updateHumidity(currentWeather.humidity)

        })
    }
Run Code Online (Sandbox Code Playgroud)

这是每个片段连接到的 ViewModel:

class WeatherViewModel(
        private val forecastRepository: IForecastRepository
) : …
Run Code Online (Sandbox Code Playgroud)

android mvvm android-fragments kotlin android-livedata

5
推荐指数
1
解决办法
3895
查看次数