使用没有生命周期所有者的LiveData

时间:2018-04-30 15:15:58

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

我找不到任何信息,如果在没有生命周期所有者的情况下使用LiveData是个坏主意。如果是的话,还有什么可以替代?

让我举一个简单的例子

class Item() {
    private lateinit var property: MutableLiveData<Boolean>

    init {
        property.value = false
    }

    fun getProperty(): LiveData<Boolean> = property

    fun toggleProperty() {
        property.value = when (property.value) {
            false -> true
            else -> false
        }
    }
}

class ItemHolder {

    private val item = Item()

    private lateinit var observer: Observer<Boolean>

    fun init() {
        observer = Observer<Boolean> { item ->
            updateView(item)
        }
        item.getProperty().observeForever(observer)
    }

    fun destroy() {
        item.getProperty().removeObserver(observer)
    }

    fun clickOnButton() {
        item.toggleProperty();
    }

    private fun updateView(item: Boolean?) {
        // do something
    }
}

2 个答案:

答案 0 :(得分:1)

对我来说LiveData有两个好处:

  1. 它了解生命周期事件,并且仅在订阅者的适当状态(Activity / Fragment)内提供更新。
  2. 它包含上次发布的值,并使用新订阅者进行更新。
  3. 正如已经说过的那样,如果您在生命周期组件(Activity / Fragment)中使用它,并且可以随时管理所提供的更新,那么您可以生命周期持有者,否则,迟早会导致崩溃或数据丢失。

    作为LiveData行为的替代方案,我可以建议来自BehaviourSubject框架的RxJava2,其行为几乎相同,保留最后更新的值,并使用新的订阅者进行更新

答案 1 :(得分:0)

您可以使用observeForever(Observer)方法在没有关联的LifecycleOwner对象的情况下注册观察者。在这种情况下,观察者被视为始终处于活动状态,因此始终会收到有关修改的通知。您可以删除调用removeObserver(Observer)方法的这些观察者。

参考 https://developer.android.com/topic/libraries/architecture/livedata.html#work_livedata