2021-10-19

HiDataBus 支持发送粘性消息和非粘性消息
object HiDataBus {
private val eventMap = ConcurrentHashMap<String, StickyLiveData<*>>()
fun with(eventName: String): StickyLiveData {
/**
* 基于事件名称,订阅,分发;
* 一个livedata只能发送一种数据类型
* 不同的事件需要使用不同的livedata实例去分发
/
var liveData = eventMap[eventName]
if (liveData == null) {
liveData = StickyLiveData(eventName)
eventMap[eventName] = liveData
}
return liveData as StickyLiveData
}
class StickyLiveData(private val eventName: String) : LiveData() {
var mStickyData: T? = null
var mVersion = 0
fun setStickyData(stickDta: T) {
mStickyData = stickDta
// setValue 方法只能在主线程中发送
setValue(stickDta)
}
fun postStickyData(stickyData: T) {
mStickyData = stickyData
postValue(stickyData)
}
/
*
* 重写setValue方法
/
override fun setValue(value: T) {
mVersion++
super.setValue(value)
}
/
*
* 重写postvalue方法
/
override fun postValue(value: T) {
mVersion++
super.postValue(value)
}
override fun observe(owner: LifecycleOwner, observer: Observer) {
observerSticky(owner, false, observer)
}
/
*
* 观察粘性事件
/
fun observerSticky(
owner: LifecycleOwner,
sticky: Boolean,
observer: Observer
) {
//owner.getLifecycle().addObserver(wrapper);
owner.lifecycle.addObserver(LifecycleEventObserver { source, event ->
// 监听宿主发生销毁事件,主动把liveData移除
if (event == Lifecycle.Event.ON_DESTROY) {
eventMap.remove(eventName)
}
})
// 完成真正的注册
super.observe(owner, StickyObserver(this, sticky, observer))
}
}
/
*
* 自定义一个observer的派生类,实现对粘性事件的判断
/
class StickyObserver(
val stickyLiveData: StickyLiveData,
val sticky: Boolean,
val observer: Observer
) : Observer {
private var lastVersion = stickyLiveData.mVersion
override fun onChanged(t: T) {
/
*
* mVersion 和livedata 的version对齐是为了控制粘性事件的分发,sticky不等于true表示不接受粘性事件
*/
// 如果没有更新的事件要发送
if (lastVersion >= stickyLiveData.mVersion) {
// 如果需要发送粘性事件,并且发送的数据不为空
if (sticky && stickyLiveData.mStickyData != null) {
observer.onChanged(stickyLiveData.mStickyData)
}
return
}
lastVersion = stickyLiveData.mVersion
observer.onChanged(t)
}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值