LiveDataBus的使用

LiveData是一个Android框架中的数据类,能够感知组件的生命周期,避免内存泄漏。它在组件活跃时才更新UI,并在配置变更时自动处理数据恢复。LiveDataBus是一个消息总线实现,使用单例模式,通过键值对存储不同通道的消息。订阅者通过with方法订阅消息,发布者发布消息。此外,还介绍了如何修改LiveData实现粘性事件,确保即使在组件不活跃时也能立即接收消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详情

LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment或 Service 等组件的生命周期。简单来说,他主要有一下优点。

它可以做到在组件处于激活状态的时候才会回调相应的方法,从而刷新相应的 UI,不用担心发生内存泄漏
当 config 导致 activity 重新创建的时候,不需要手动取处理数据的储存和恢复。它已经帮我们封装好了。
当 Actiivty 不是处于激活状态的时候,如果你想 livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调 obsever 的 onChange 方法,你可以使用 observeForever 方法,但是你必须在 onDestroy 的时候 removeObserver。

LiveDataBus 的组成

消息 消息可以是任何的Object,可以定义不同类型的消息,如 Boolean、String。也可以定义自定义类型的消息。
消息总线 消息总线通过单例实现,不同的消息通道存放在一个 HashMap中。
订阅 订阅者通过 with 获取消息通道,然后调用 observe 订阅这个通道的消息。
发布 发布者通过 with 获取消息通道,然后调用 setValue 或者 postValue 发布消息。

修改LiveData粘性事件

class SingleLiveData<T> : MutableLiveData<T>() {
    override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
        super.observe(owner, observer)
        hook(observer)
    }

    fun observeStick(owner: LifecycleOwner, observer: Observer<in T>){
        super.observe(owner, observer)
    }

    /**
     * 反射获取 mLastVersion 修改值
     */
    private fun hook( observer: Observer<in T>) {
        val liveDataClass = LiveData::class.java
        val mObserversField = liveDataClass.getDeclaredField("mObservers")
        mObserversField.isAccessible = true
        val mObservers = mObserversField.get(this)
        val observerClass = mObservers::class.java

        val get = observerClass.getDeclaredMethod("get",Any::class.java)
        get.isAccessible = true
        val entry = get.invoke(mObservers, observer)
        val observerWrapper = (entry as Map.Entry<Any,Any>).value
        val wrapperClass = observerWrapper.javaClass.superclass

        val mLastVersion = wrapperClass.getDeclaredField("mLastVersion")
        mLastVersion.isAccessible = true
        val mVersion = liveDataClass.getDeclaredField("mVersion")
        mVersion.isAccessible = true
        val mVersionValue = mVersion.get(this)
        mLastVersion.set(observerWrapper,mVersionValue)
    }
}

LiveDataBus类

object LiveDataBus {
    private val mBus = hashMapOf<String, SingleLiveData<Any>>()

    fun <T>with(channel: String): SingleLiveData<T> {
        if (!mBus.containsKey(channel)) {
            mBus[channel] = SingleLiveData()
        }
        return mBus[channel]!! as SingleLiveData<T>
    }
}

使用

//接收消息
 LiveDataBus.with<"参数类型">("key").observe(this) {
  	//it为 发布消息的value
 }
//发布消息
 LiveDataBus.with<"参数类型">("key").value = mState.mPicList//赋值后observe接收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值