eventbus 使用_使用RxJava 2输入安全性EventBus

eventbus 使用

When RxJava came to the world the Event bus pattern implementation becomes much easier, but we still need to write abstraction on top of the RxJava to make type safety API for our EventBus. First of all, create an EventBus interface.

当RxJava出现时,事件总线模式实现变得更加容易,但是我们仍然需要在RxJava之上编写抽象,以为EventBus创建类型安全API。 首先,创建一个EventBus接口。

事件总线 (EventBus)

interface EventBus {
    fun <E : BusEvent> publish(queue: Queue<E>, e: E)


    fun <E : BusEvent> queue(queue: Queue<E>): EventSubject<E>


    fun <E : BusEvent> consumeReplayQueue(queue: Queue<E>): Observable<E>


    fun <E : BusEvent> clearReplayQueue(queue: Queue<E>)


    fun <E : BusEvent> consumeReplayQueue(queue: Queue<E>, actionBeforeClearingQueue: (t: E) -> Boolean): Observable<E>
}

A class implements the BusEvent interface to indicate EventBus event.

一个类实现BusEvent接口以指示EventBus事件。

class NoneEvent: BusEvent
class LowMemoryEvent: BusEvent

队列 (Queue)

For each type of event, we need to create Queue . Each Queue defines stream behavior. For example, it will be a replay (using BehaviorSubject) last event queue or not (using PublishSubject).

对于每种类型的事件,我们需要创建Queue 。 每个Queue定义流行为。 例如,它将是重播(使用BehaviorSubject)最后一个事件队列,而不是(使用PublishSubject)。

object EventQueue {


    val LOW_MEMORY_EVENT: Queue<NoneEvent> = Queue.of(NoneEvent::class.java).get()
    val LOW_MEMORY_EVENT_REPLAY: Queue<LowMemoryEvent> = Queue.of(LowMemoryEvent::class.java).replay().get()
}

The consumeReplayQueue method fire cached event and clear stream by publishing internal IdleEvent that will be filtered.

consumeReplayQueue方法通过发布将被过滤的内部IdleEvent来触发缓存的事件并清除流。

override fun <E : BusEvent> consumeReplayQueue(queue: Queue<E>): Observable<E> {
        return queue(queue)
            .filter { it !is IdleEvent }
            .doOnNext { clearReplayQueue(queue) }
    }


    override fun <E : BusEvent> clearReplayQueue(queue: Queue<E>) {
        publish(queue, IdleEvent() as E)
    }

(Stream)

To get stream we need to call queue the method of EventBus interface and passe one of the queues that we created earlier. As a result, we get EventSubject , it’s a custom Subject that wrapping PublishSubject and BehaviorSubject . Under the hood, EventBus keep the map of Queue and EventSubjects. Each stream has lazy initialization.

为了获得流,我们需要使用EventBus接口的方法调用queue ,并EventBus我们之前创建的队列之一。 结果,我们得到EventSubject ,它是包装PublishSubjectBehaviorSubject的自定义Subject 。 在内部,EventBus保留Queue和EventSubjects的映射。 每个流都有延迟初始化。

And finally a quick example of how to use out EventBus:

最后是有关如何使用EventBus的快速示例:

// Subscribe on event queue         
eventBus.queue(EventQueue.LOW_MEMORY_EVENT)
  .subscribe { /* Handle event */ }
  .also { viewDisposableScope.add(it) }


// Publish new event
eventBus.publish(EventQueue.LOW_MEMORY_EVENT, LowMemoryEvent())

with replay stream

重播流

// Subscribe on event queue
eventBus.consumeReplayQueue(EventQueue.LOW_MEMORY_EVENT_REPLAY)
   .subscribe { /* Handle event */ }
   .also { viewDisposableScope.add(it) }


// Publish new event
eventBus.publish(EventQueue.LOW_MEMORY_EVENT_REPLAY, LowMemoryEvent())

Thanks for the reading, all code you can find here.

感谢您的阅读,您可以在此处找到所有代码。

翻译自: https://proandroiddev.com/type-safety-eventbus-with-rxjava-2-c10d3ea6f7e0

eventbus 使用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值