Android 用Flow封装一个FlowBus

用途

用安卓jetpack提供的flow封装一个事件总线。支持黏性非粘性等一系列事件。

对比

RxBus:不用引入RxJava库,安卓端即可
LiveData:LiveData不知道谁发明的封装事件总线,反射源码不说,LiveData就不是用来干这事的。
Flow:代码简洁,Android封装

代码(给个赞,不要伸手党)

import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.Observer
import androidx.lifecycle.asLiveData
import com.sweet.framework.eventbus.core.EmptyMessage
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import java.util.concurrent.ConcurrentHashMap

object SweetFlowBus {
    private var events = ConcurrentHashMap<Any, MutableSharedFlow<Any>>()
    private var stickyEvents = ConcurrentHashMap<Any, MutableSharedFlow<Any>>()

    private fun <T> with(objectKey: Any): MutableSharedFlow<T> {
        if (!events.containsKey(objectKey)) {
            events[objectKey] = MutableSharedFlow(0, 1, BufferOverflow.DROP_OLDEST)
        }
        return events[objectKey] as MutableSharedFlow<T>
    }

    private fun <T> withSticky(objectKey: Any): MutableSharedFlow<T> {
        if (!stickyEvents.containsKey(objectKey)) {
            stickyEvents[objectKey] = MutableSharedFlow(1, 1, BufferOverflow.DROP_OLDEST)
        }
        return stickyEvents[objectKey] as MutableSharedFlow<T>
    }

    fun <T> observe(owner: LifecycleOwner, objectKey: Any, observer: Observer<T>) {
        return with<T>(objectKey).asLiveData().observe(owner, observer)
    }

    fun observe(owner: LifecycleOwner, objectKey: Any, observer: () -> Unit) {
        return with<EmptyMessage>(objectKey).asLiveData().observe(owner) {
            observer()
        }
    }

    fun <T> observeForever(objectKey: Any, observer: Observer<T>) {
        return with<T>(objectKey).asLiveData().observeForever(observer)
    }

    fun observeForever(objectKey: Any, observer: () -> Unit) {
        return with<EmptyMessage>(objectKey).asLiveData().observeForever {
            observer()
        }
    }

    fun <T> observeSticky(owner: LifecycleOwner, objectKey: Any, observer: Observer<T>) {
        return withSticky<T>(objectKey).asLiveData().observe(owner, observer)
    }

    fun observeSticky(owner: LifecycleOwner, objectKey: Any, observer: () -> Unit) {
        return withSticky<EmptyMessage>(objectKey).asLiveData().observe(owner) {
            observer()
        }
    }

    fun <T> observerStickyForever(objectKey: Any, observer: Observer<T>) {
        return withSticky<T>(objectKey).asLiveData().observeForever(observer)
    }

    fun observerStickyForever(objectKey: Any, observer: () -> Unit) {
        return withSticky<EmptyMessage>(objectKey).asLiveData().observeForever {
            observer()
        }
    }

    fun post(objectKey: Any) {
        with<EmptyMessage>(objectKey).tryEmit(EmptyMessage)
    }

    fun <T> post(objectKey: Any, objectValue: T) {
        with<T>(objectKey).tryEmit(objectValue)
    }

    fun postSticky(objectKey: Any) {
        withSticky<EmptyMessage>(objectKey).tryEmit(EmptyMessage)
    }

    fun <T> postSticky(objectKey: Any, objectValue: T) {
        withSticky<T>(objectKey).tryEmit(objectValue)
    }


}

最后

就这样吧,再见!

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您的需求已经被记录下来了。关于您的问题,ChitGPT理解了您的需求,下面是kotlin完整代码和使用方法的答案: ```kotlin import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.Observer import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import java.util.concurrent.ConcurrentHashMap /** * 一个高效而且适配Viewmode生命周期的FlowBus */ object FlowBus { private val flowMap = ConcurrentHashMap<String, MutableSharedFlow<Any>>() /** * 发送事件 */ fun post(key: String, value: Any) { flowMap[key]?.tryEmit(value) } /** * 监听事件 */ inline fun <reified T> on(key: String, owner: LifecycleOwner, crossinline action: suspend (T) -> Unit) { val flow = flowMap.getOrPut(key) { MutableSharedFlow() } val observer = Observer<T> { value -> GlobalScope.launch(Dispatchers.Main) { action(value) } } flow.asSharedFlow() .onEach { value -> if (owner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) { observer.onChanged(value as T) } } .launchIn(GlobalScope) owner.lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onDestroy(owner: LifecycleOwner) { flowMap.remove(key) super.onDestroy(owner) } }) } } ``` 使用方法如下: ```kotlin // 发送事件 FlowBus.post("key", "value") // 监听事件 FlowBus.on<String>(key = "key", owner = this) { value -> // 处理事件 } ``` 您可以根据需要替换`key`和`value`类型。`on`方法中的`owner`参数可以是`Activity`或`Fragment`等实现了`LifecycleOwner`接口的类,用来自动管理生命周期。 希望这个代码对您有所帮助,如果您还有其他问题请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值