【问题标题】:Using LiveData without LifecycleObserver在没有 LifecycleObserver 的情况下使用 LiveData
【发布时间】:2018-11-27 00:55:23
【问题描述】:

我正在编写一个(试图)遵守 MVVM 设计模式的应用程序。我想从该层的其他部分观察模型层的变化。例如

假设我正在使用 room 从我的数据库中公开一个对象列表:

@Dao
interface MyDao {
    @Query("SELECT * FROM myTable")
    fun getAllElements(): LiveData<List<Element>>
}

我希望能够像使用LiveData.observeForever(). 的生命周期所有者一样观察变化,例如:

class BusinessLogicPartOfTheModel(private val myDao: MyDao) {
    private var allElements = listOf<Element>()

    init {
        myDao.getAllElements().observeForever { observedElements ->
            allElements = observedElements
        }
}

但是,我发现如果我在 ViewModel 和 Fragment 中注册一个像这样的观察者以及一个更标准的观察者:

class MyViewModel(private val myDao: MyDao) : ViewModel() {
    fun getAllElements(): LiveData<List<Elements>> {
        myDao.getAllElements()
    }
}

class MyFragment : Fragment() {
    private val myDao /* initialized here */
    private val myViewModel /* initialized here */
    private val logic = BusinessLogicPartOfTheModel(myDao)

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val obs = Observer<List<Element>> {
             // do a thing
        }
        myViewModel.getAllElements.observe(viewLifeCycleOwner, obs)
    }
}

只有片段中的观察者被调用,而不是业务逻辑对象中的观察者。我可以成功地观察片段中的更新并将事件传递回业务逻辑,但这似乎是一个非常不必要的间接级别。我是否在这里遗漏了一步,或者这不太可能按照我想要的方式运行?

【问题讨论】:

  • 对于现在提出这个问题的任何人:我建议改用协程Flows。如果您需要在模型层之上,它们很容易转换为LiveData

标签: android kotlin observable android-livedata


【解决方案1】:

您可能应该改用MediatorLiveData

MediatorLiveData 接受另一个LiveData 作为事件源,方法是将其添加到MediatorLiveData

你可以使用类似的东西,

val mediatorLiveData = MediatorLiveData<Item>().apply {
    addSource(yourLiveData) {
        // do something here
    }
}

你也可以看看Transformations

Transformations 具有诸如 Transformation.map()Transformation.switchMap() 之类的方法,它们只是在底层使用 MediatorLiveData

【讨论】:

  • 这在我的具体情况下看起来确实很有用。这个问题在just 观察来自非生命周期所有者的实时数据方面稍有表述,而MediatorLiveData 似乎更倾向于观察 重新发布。
  • 如果没有生命周期,您真的无法观察到LiveData。这是LiveData 的重点。
猜你喜欢
  • 1970-01-01
  • 2020-09-21
  • 2021-10-30
  • 2010-12-09
  • 2018-03-02
  • 2019-06-20
  • 2014-10-07
  • 2018-04-08
  • 2011-10-26
相关资源
最近更新 更多