Android开发Android开发经验谈Android技术知识

EventPort 好用轻量的事件总线

2022-09-19  本文已影响0人  mm_cuckoo

设计背景

不影响对象本身的生命周期的前提下建立一个易维护,使用方便的事件总线机制

功能

  1. 一对一的对象事件
  2. 一对多的对象事件

注意:不支持进程间使用
源码GitHub:https://github.com/mm-sgf/EventPort

快速接入

kapt {
    arguments {
        arg('EventPort', 'true')
    }
}
plugins {
    id 'kotlin-kapt'
}
implementation 'com.github.mm-sgf.EventPort:eventport:v1.0.0'
kapt 'com.github.mm-sgf.EventPort:eventport-compiler:v1.0.0'

API 使用

@SingleEvent
interface ModuleSingleEvent {
    fun getMessage() : Int
}
@MultiEvent
interface ModuleMultiEvent {
    fun printModuleMessage(msg: String)
}

事件接口事通过注解进行定义的,事件注解目前只有两种类型.

注解 介绍
@SingleEvent 该注解定义的是一对一事件,一个事件只能有一个接收者,接口中方法可以有返回值
@MultiEvent 该注解定义的是一对多事件,一个事件可以有多个接收者,接口中方法不可以有返回值
/**
 * 1.设置接收注释
 * 2.实现事件接口
 */
@ReceiveEvent
class ModuleReceive : ModuleSingleEvent {
    init {
        // 注入接收事件实体
        EventPort.inject(this)
    }

    override fun getMessage(): String {
        return "hello world"
    }
}
/**
 * 1.设置接收注释
 * 2.实现事件接口
 */
@ReceiveEvent
class ModuleReceive : ModuleMultiEvent {
    init {
        // 注入接收事件实体
        EventPort.inject(this)
    }
    
    override fun printModuleMessage(msg: String) {
        // 接收一对多事件
    }
}

发送事件

每一个事件都有对应的一个事件handler , 获取到这个事件handler 就可以发送事件

val eventHandler = EventPort.findEventHandler(ModuleSingleEvent::class.java)
eventHandler?.getMessage()
val eventHandler = EventPort.findEventHandler(ModuleMultiEvent::class.java)
eventHandler?.printModuleMessage("hello world")

事件响应原理

接收事件对象实现事件接口,在对象创建后将接收事件对象注册到事件映射表中,当要发送一个事件时,通过EventPort 获取到对应事件的代理类进行事件的发送



工程设计思想

通过APT 技术在工程build时,扫描事件注解接口和接收类,生成事件代理类,在build 主工程时生成事件接口和事件接收类的映射关系


上一篇 下一篇

猜你喜欢

热点阅读