多次调用 Android LiveData observe

标签 android kotlin android-lifecycle android-architecture-components android-livedata

我有一个 BaseActivity,它有一个 MutableLiveData 字段,如下所示

val refInfoLiveData: MutableLiveData<RefInfo?> by lazy { MutableLiveData<RefInfo?>() }

BaseActivityonStart 方法被调用时,将进行网络调用以填充此 MutableLiveData 字段。

我还有几个 Fragment,它们是继承 BaseActivityActivity 的一部分。

在这些 fragment 中,我在 fragment 的 onResume 方法中进行另一个调用,如下所示

    (activity as BaseActivity).refInfoLiveData.observe(this, Observer {
        it?.let { refInfo ->
            adapter?.setRefInfo(refInfo)
        }
    })

当第一次创建 fragment 时,observe 只被调用一次,但 fragment 进入后台然后返回,它被调用多次,这会导致问题。

这个问题可能是什么原因,我该如何解决?

如有任何帮助,我们将不胜感激。

最佳答案

那是因为你应该在 onViewCreated 中使用 observe(viewLifecycleOwner, Observer { ...

import androidx.lifecycle.observe

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    (activity as BaseActivity).refInfoLiveData.observe(viewLifecycleOwner) { refInfo ->
        refInfo?.let { adapter.setRefInfo(it) }
    }
}

目前,如果您将应用置于后台然后无限次将其置于前台,您将拥有无限数量的订阅者。

关于多次调用 Android LiveData observe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56480597/

相关文章:

kotlin - 如何使用函数中的泛型来避免重复代码?

android - 收到低内存警告,但我似乎没有泄漏内存

android - 如何保持 Android 应用程序运行并退出 Unity Activity

android - 在 android 中使用 HostName 时获取 java.net.UnknownHostException

java - 无法将 BLOB 转换为字符串

unit-testing - 在 Kotlin 中模拟 "global"属性

android - MutableLiveData<Pair<Float, Float>>() -> Val 不能被重新赋值

android - 在android上的报警 channel 上播放声音

Android 开发 - 使用 ArrayList<String> 与带 ArrayAdapter 的字符串数组

android - 在 fragment 中的 onViewCreated() 之后调用 onActivityCreated() 吗?