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

Tim*_*ima 5 android kotlin android-livedata android-architecture-components

如果没有生命周期所有者使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

Moh*_*Zek 8

你可以注册一个没有关联 LifecycleOwner 对象的观察者,使用

observeForever(Observer) method
Run Code Online (Sandbox Code Playgroud)

像那样:

 orderRepo.getServices().observeForever(new Observer<List<Order>>() {
            @Override
            public void onChanged(List<Order> orders) {
               //
            }
        });
Run Code Online (Sandbox Code Playgroud)


ali*_*izx 5

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

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


Dem*_*god 3

对我来说LiveData有两个好处:

  1. 它了解生命周期事件,并且仅在订阅者 ( Activity/ Fragment) 的适当状态下传递更新。
  2. 它保存最后发布的值,并用它更新新的订阅者。

正如已经说过的,如果您在生命周期组件(Activity/ Fragment)之外使用它,并且可以随时管理交付的更新,那么您可以在没有生命周期持有者的情况下使用它,否则迟早会导致崩溃或数据丢失。

作为该行为的替代方案LiveData,我可以建议使用BehaviourSubjectfromRxJava2框架,其行为几乎相同,保存最后更新的值,并用它更新新的订阅者。