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

如何阻止LiveData事件被多次触发

裴昕
2023-03-14

我在我的应用程序中使用MutableLiveData进行基于事件的通信。我有单一活动两个片段架构。

在ViewModel的帮助下,我正在使用Fragment-1中的LiveData事件。但是,当我使用菜单栏用Fragment-2替换这个Fragment-1并最终返回Fragment-1时,LiveData的旧值再次被捕获。

如何避免这个问题?非常感谢任何帮助/建议!谢谢你。

共有3个答案

岳涵煦
2023-03-14

接受答案的问题是,你只能有一个观察者。这篇文章描述了具有多个观察者的解决方案。

邹野
2023-03-14

无论您在哪里观察liveData,在onChanged方法中,通过调用myLiveDataObject来移除观察者。移除观察者(这个) 这将在观察到第一次数据后移除观察者。

皮安顺
2023-03-14

您可以使用Event包装LiveData值,以处理消费其值的操作,如下文所示:https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150

事件类是这样的:

open class Event<out T>(private val content: T) {

    var hasBeenHandled = false
        private set // Allow external read but not write

    /**
     * Returns the content and prevents its use again.
     */
    fun getContentIfNotHandled(): T? {
        return if (hasBeenHandled) {
            null
        } else {
            hasBeenHandled = true
            content
        }
    }

    /**
     * Returns the content, even if it's already been handled.
     */
    fun peekContent(): T = content
}

让我们说你的LiveData值是一个字符串,那么单个事件的LiveData就像:

val navigateToDetails=MutableLiveData

 类似资料:
  • 我对TextWatcher有一个恼人的问题。我一直在网上搜索,但什么也找不到。如果有人能帮助我,我将不胜感激。 由于某些原因,在一次文本更改时对TextWatcher事件的调用是不稳定的。有时它们被触发一次(就像它们应该被触发的那样),有时两次,有时三次。不知道为什么,整个事情都很直截了当。有时,PostTextChanged()上的可编辑参数在toString()和length()中返回空值。

  • 当切换回第一个选项卡时,我需要不要再次返回数据!我做错了什么?你能帮帮我吗? 附言。对于导航,我使用navigation-advanced-sample中的sample,在切换选项卡后,不调用。 文章中的第一个解决方案是在片段中观察ViewModel中的LiveData: 一个合适的解决方案是使用getViewLifeCycleOwner()作为LifeCycleOwer,同时观察onActivi

  • 第一次调用时,激发一次 第二次调用时,会激发两次 等等 编辑: 下面是一个jsfiddle示例(如下所示)。 要复制,请单击按钮,然后单击,然后单击一个并重复此过程 您将注意到,第二次执行该过程时,文本会加倍

  • 场景:我有两个片段,分别名为和。我从转到选择一个单元,使用

  • 我有一个,它有一个字段,如下所示 我还有几个,它们是继承的的部分。 在其中一个如果这些片断中,我将在片断的方法中进行另一个调用,如下所示 当第一次创建片段时,只调用一次,但片段会转到后台,然后返回,它会被多次调用,这会引起问题。 如有任何帮助,我们将不胜感激。

  • 问题内容: 我试图用Javascript编写视频扑克游戏,以降低其基础知识,但是我遇到了一个问题,其中jQuery click事件处理程序多次触发。 它们被附加到用于下注的按钮上,并且对于在游戏过程中第一手下注(仅触发一次)非常有效。但是在秒针下注中,每次按下一个下注或下注按钮都会触发两次点击事件(因此,每次按下正确的赌注量是两次)。总体而言,在按一次下注按钮时,触发单击事件的次数遵循此模式序列的