当前位置: 首页 > 知识库问答 >
问题:

我什么时候应该删除Android上的livedata观察者?

许马鲁
2023-03-14
override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
...

//Authentication observer which is the ItemAuto dependent
viewModel.auth.observe(viewLifecycleOwner, Observer {auth ->
            updateUserItemAutoLiveData(auth)
        })
}


private fun updateUserItemAutoLiveData(auth: Auth) {
        if (!auth.uid.isNullOrEmpty()) {

            removeUserItemAutoObservers()

            itemAutoLiveDate = viewModel.getUserItemAutoLiveData(auth.uid)

            itemAutoLiveDate!!.observe(viewLifecycleOwner, Observer {
                if (it != null) {
                    if (it.data != null) {
                        itemAutoCompleteAdapter.submitItemAuto(it)
                    } 
                }
            })

        } else {
            removeUserItemAutoObservers()
        }
    }

private fun removeUserItemAutoObservers() {
    if (itemAutoLiveDate != null && itemAutoLiveDate!!.hasObservers()) {
        itemAutoLiveDate!!.removeObservers(this)
    }
} 

共有1个答案

邓毅
2023-03-14

如果您使用的是observe方法,则LiveData将在onDestroy状态下自动清除。

观察者绑定到生命周期对象,并在其关联的生命周期被破坏时自行清理。

更多信息可以在这里找到

 类似资料:
  • 我发现了这个例子: 但是我不明白为什么我们需要和?和方法是用于什么?

  • 根据我在文档中的理解,每次实例化ViewModel的视图(使用前面的代码)被破坏时,我都应该删除观察者,对吗?但是,一旦视图被销毁(因为ViewModel实例在视图中被实例化,也将被销毁),观察者不应该被销毁吗?

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 如何在收到第一个结果后移除观察者?下面是我尝试过的两种代码方式,但它们都不断接收更新,即使我已经删除了观察者。

  • 问题内容: 有什么区别?什么时候应该使用容量为1的对抗? 问题答案: SynchronousQueue更像是一个传递,而LinkedBlockingQueue仅允许单个元素。区别在于对SynchronousQueue的put()调用直到有相应的take()调用 才返回 ,但LinkedBlockingQueue的大小为1,则put()调用(对空队列)将立即返回。 我不能说自己曾经直接使用过Sync

  • 问题内容: 我对使用和翻译有疑问。我了解到,在模型中,我应该使用。但是还有其他地方我也应该使用吗?表单定义呢?它们之间是否存在性能差异? 编辑: 还有一件事。有时候,代替被使用。正如文档所述,仅在将字符串显示给用户之前,才将字符串标记为要翻译,并在可能的最新情况下进行翻译,但是我在这里有点困惑,这与功能相似吗?我仍然很难决定在模型和表格中应该使用哪个。 问题答案: ugettext() 与 uge