【问题标题】:Android LiveData observe is called multiple timesAndroid LiveData 观察被多次调用
【发布时间】:2019-06-06 15:19:05
【问题描述】:

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

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

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

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

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

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

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

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

任何帮助将不胜感激。

【问题讨论】:

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


【解决方案1】:

那是因为你应该在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) }
    }
}

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

【讨论】:

    【解决方案2】:

    https://www.javatpoint.com/android-life-cycle-of-activity

    也许你可以尝试使用另一个生命周期钩子,因为onResume() 是最常被调用的入口钩子。

    onCreate() 中尝试一下。

    【讨论】:

    • 将其移至 onActivityCreated 将解决该问题,但在我的情况下它会产生不同的问题,因此我需要将其保留在 onResume 中
    • 不要使用onActivityCreated,在我知道的任何场景中都没有理由使用它?
    • @Tartar,如果你想保留在onResume,你需要实现自己的LifeCycleOwner,而不是使用默认的viewLifecycleOwner
    • @d4ku3,请包含链接页面中的一些相关内容,以防链接损坏。通过点击链接告诉读者他们会发现什么也很有帮助。
    • @Preacher 当然,也许你可以告诉我如何包含图片^^,想显示生命周期图
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多