Android LiveData阻止在观察时收到最后一个值

帕维尔·波利

LiveData开始观察时是否可以防止接收到最后一个值?我正在考虑LiveData用作事件。

例如类似于show message,导航事件或对话框触发器之类的事件EventBus

ViewModel和片段之间的通信有关的问题,Google给我们LiveData提供了用数据更新视图的方法,但是这种类型的通信不适用于仅需通过单个事件更新视图一次的情况,也无法保存视图的引用ViewModel并调用某些方法,因为它将导致内存泄漏。

我发现了类似的SingleLiveEvent-但它仅适用于1个观察者,不适用于多个观察者。

-更新-

正如@EpicPandaForce所说:“没有理由将LiveData用作不是它的东西”,问题的意图可能是MVVM中带有LiveData的视图和ViewModel之间的通信

史诗熊猫力量

没有理由不使用LiveData。如果您需要一个单独的行为(某种东西不会保留以前的值),那么您应该使用一个不能保留以前的值的组件-而不是乱砍它(“记住”它已经发出并忘记了)发射等)

您可以添加event-emitter库:

implementation 'com.github.Zhuinden:event-emitter:1.1.0'

从Jitpack: maven { url "https://jitpack.io" }

那你可以做

// read
private var subscription: EventSource.NotificationToken? = null

fun observe() {
    subscription = events.startListening { event ->
        showToast(event)
    }
}

fun unsubscribe() {
    subscription?.stopListening()
    subscription = null
}

但是,如果您需要像这样使用它:

    controllerEvents.observe(viewLifecycleOwner) { event: WordController.Events ->
        when (event) {
            is WordController.Events.NewWordAdded -> showToast("Added ${event.word}")
        }.safe()
    }

那你可以用

import android.arch.lifecycle.Lifecycle
import android.arch.lifecycle.LifecycleObserver
import android.arch.lifecycle.LifecycleOwner
import android.arch.lifecycle.OnLifecycleEvent
import com.zhuinden.eventemitter.EventSource

private class LiveEvent<T> constructor(
    private val eventSource: EventSource<T>,
    private val lifecycleOwner: LifecycleOwner,
    private val observer: EventSource.EventObserver<T>
) : LifecycleObserver {
    init {
        if (lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) {
            lifecycleOwner.lifecycle.addObserver(this)
        }
    }

    private var isActive: Boolean = false
    private var notificationToken: EventSource.NotificationToken? = null

    private fun shouldBeActive(): Boolean {
        return lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
    }

    private fun disposeObserver() {
        lifecycleOwner.lifecycle.removeObserver(this)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        if (lifecycleOwner.lifecycle.currentState == Lifecycle.State.DESTROYED) {
            stopListening()
            disposeObserver()
            return
        }
        checkIfActiveStateChanged(shouldBeActive())
    }

    private fun checkIfActiveStateChanged(newActive: Boolean) {
        if (newActive == isActive) {
            return
        }
        val wasActive = isActive
        isActive = newActive
        val isActive = isActive

        if (!wasActive && isActive) {
            stopListening()
            notificationToken = eventSource.startListening(observer)
        }

        if (wasActive && !isActive) {
            stopListening()
        }
    }

    private fun stopListening() {
        notificationToken?.stopListening()
        notificationToken = null
    }
}

fun <T> EventSource<T>.observe(lifecycleOwner: LifecycleOwner, eventObserver: (T) -> Unit) {
    LiveEvent(this, lifecycleOwner, EventSource.EventObserver<T> { event -> eventObserver.invoke(event) })
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自分类Dev

在使用支持库时,我收到一个错误,指出android中已经定义了属性“”

来自分类Java

Android:CountDownTimer跳过最后一个onTick()!

来自分类Android

在最后一个数组中选择数据(android)

来自分类Dev

Android:MySQL的ListView仅显示最后一个元素

来自分类Dev

等待最后一个元素时阻止通量

来自分类Dev

Android RecyclerView查找ItemDecoration的第一个和最后一个视图

来自分类Dev

如何在julialang中找到最后一个最大值的索引?

来自分类Dev

在x值中找到最后一个空字符串并换行

来自分类Dev

在数据框中找到最后一个值和相应的列名

来自分类Dev

当按Alt + Gr + 8([]时,IntelliJ Producs转到最后一个括号

来自分类Dev

寻找第一个空行+更新列中的值,直到最后一个非空行

来自分类Dev

如何将第二个值存储到最后一个值以与新值进行比较

来自分类Dev

LiveData无法将数据从一个活动更新到另一个活动-Android

来自分类Java

春季重试找到最后一个重试

来自分类Java

JPA找到最后一个条目

来自分类Dev

Groovy在Cloure里面找到最后一个迭代?

来自分类Java

测验中的最后一个问题后,转到Android Studio中的另一个活动

来自分类Dev

Android-检测何时可以看到RecyclerView中的最后一个项目

来自分类Dev

在Android导航体系结构中,如何检查当前Fragment是否为最后一个?

来自分类Dev

如何确定在Android中最后一个电话是呼出还是呼入

来自分类Java

在Java中显示Android计算器的最后一个运算符

来自分类Java

在Java Android Apps中打开最后一个片段视图

来自分类Dev

如何从Android中的Firestore数组检索最后一个元素?

来自分类Java

我如何在按索引列出Java Android Studio中获得最后一个号码

来自分类Dev

在Android的顶部ListView项上方(以及最后一个下方)添加边距

来自分类Dev

Android使用gridlayoutmanager在recyclerview中的最后一个元素下方添加间距

来自分类Dev

如何从Android中的TextView中删除最后一个字符?

来自分类Dev

获取Firebase数据库Android中的最后一个节点

来自分类Dev

在嵌套数据库Firebase Android中获取最后一个项目

TOP 榜单

热门标签

归档