在这种情况下,LiveData如何工作?

时间:2019-02-26 01:50:52

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

在没有其他要求之前,我并没有要求解决此问题(代码),而是要求我对LiveData的理解进行更正,因为我认为自己缺少一些内容。

据我所知,LiveData的onActive函数每当观察者(LifeCycleOwner)在Activity或Fragment的onCreate方法中处于活动状态时就会触发一次。

这是我现在要处理的问题。

我使用 Android导航组件,我的Activity A拥有一个导航图,在此图中,两个片段共享通用逻辑,因此,与其创建用于相互通信的接口,为了简便起见,我使用ViewModel来命名为ActivityAViewModel。

现在,此VM包含以下内容。

  • 此VM的私有MediatorLiveData,可以向其中报告值
  • 将此MediatorLiveData作为LiveData返回的公共函数,防止UI控制器修改其值
  • 一个完成某些工作的函数,该工作返回一个LiveData,该工作返回的LiveData使用一个Transformation,返回必要的UI数据。
  • 它看起来像这样:

ActivityAViewModel.kt

// Private Mediator LiveData
private val mediatorLD = MediatorLiveData<Boolean>()

// Public immutable access of the mediator LiveData
fun mediatorLD(): LiveData = mediatorLD

// Representation of what the transformation is doing.
fun doFoo() {
   val workLD: LiveData<WrapperClass<Boolean>> = repository.someWork()
   Transformations.map(workLD) { wrappedResult ->
      mediatorLD.postValue(wrappedResult.myBoolean)
   }
}

现在,两个UI控制器MyFragmentB.kt和MyFragmentC.kt正在观察MutableLiveData的LiveData版本,我的问题是,当MyFragmentB执行doFoo()时,它会相应地接收结果,那里没有问题,但是当我导航到MyFragmentC.kt时,相同的结果会报告给C,反之亦然。

我不希望发生这种情况,如果FragmentB已经观察到了更改,那么我就不会C来监听该更改。

我有点理解为什么会这样。

据我所知,LiveData的onActive函数每当观察者(LifeCycleOwner)在Activity或Fragment的onCreate方法中处于活动状态时就会触发一次。

由于已使用 postValue 检测到更改,因此ViewModel正在等待其观察者处于活动状态以便分派结果。

导航到另一个片段时,观察者准备就绪,触发onActive并检测到更改。

是否有办法防止两个片段接收结果?我的意思是,当这两个中的一个收到结果时,另一个不会听吗?

1 个答案:

答案 0 :(得分:1)

您应该相应地设计此事件,与Jeel分享的博客文章中讨论的Event Wrapper非常相似。

https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150

基本思想是Event将仅使用一次。然后,您可以使用LiveData将其包装。在LiveData中设置新事件时,将在第一次使用新事件之后通知观察者该事件,后续使用将不返回任何值。