EventBus封装到项目架构|青训营笔记

简介: 封装该库到自己的项目的目的有两个便捷绑定和解绑 EventBus便捷通过 EventBus 发送消息和处理消息代码美观

前置知识

封装过程

封装该库到自己的项目的目的有两个

  1. 便捷绑定和解绑 EventBus
  2. 便捷通过 EventBus 发送消息和处理消息
  3. 代码美观

基于上面的目的,我们可以利用 注解 、编写 工具类封装到基类抽象消息类 来实现

依赖引入

我们先引入对应的依赖

//build.gradle(:app)
defaultConfig {
    ...
    javaCompileOptions {
        annotationProcessorOptions {
            //此处路径填写自己的包名+类名
            arguments = [ eventBusIndex : 'com.qxy.potato.MyEventBusIndex' ]
        }
    }
    ...
}
dependencies {
    ...
    //eventBus
    def eventbus_version = '3.2.0'
    implementation "org.greenrobot:eventbus:$eventbus_version"
    annotationProcessor "org.greenrobot:eventbus-annotation-processor:$eventbus_version"
}
复制代码

上面引入了 EventBus的注解器,该注解器可以帮忙生成 索引,大幅度提高EventBus的使用效率

1.webp.jpg

由上图可知,使用了注解可以利用索引的 EventBus ,效率是可以大幅度提升的,所以我们是很有必要去利用EventBus的索引类

使用索引的时候,我们需要注意如下点

索引要求

  • @Subscribe方法及其类必须是公共的
  • 事件类必须是公共的
  • @Subscribe不能****在匿名类内部使用。

注意: 当 EventBus 无法使用索引时,例如,如果不满足上述要求,它将在运行时回退到反射。这可确保@Subscribe方法接收事件,即使它们不是索引的一部分。

Translate from Subscriber Index - Open Source by greenrobot

编写工具类

public class EventBusUtil {
    /**
     * 发送消息(事件)
     * @param event
     */
    public static void sendEvent(BaseEvent<?> event){
        EventBus.getDefault().post(event);
    }
    /**
     * 发送 粘性 事件
     *
     * 粘性事件,在注册之前便把事件发生出去,等到注册之后便会收到最近发送的粘性事件(必须匹配)
     * 注意:只会接收到最近发送的一次粘性事件,之前的会接受不到。
     * @param event
     */
    public static void sendStickyEvent(BaseEvent<?> event){
        EventBus.getDefault().postSticky(event);
    }
}
复制代码

编写注解类

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindEventBus {
}
复制代码

Base封装

public class BaseEvent<T> {
    private int eventCode;
    private T data;
    public BaseEvent(int eventCode, T data) {
        this.eventCode = eventCode;
        this.data = data;
    }
    public int getEventCode() {
        return eventCode;
    }
    public void setEventCode(int eventCode) {
        this.eventCode = eventCode;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}
复制代码
//Fragment也是类似
public abstract class BaseActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(this.getClass().isAnnotationPresent(BindEventBus.class)){
            EventBus.getDefault().register(this);
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(this.getClass().isAnnotationPresent(BindEventBus.class)){
            EventBus.getDefault().unregister(this);
        }
    }
}
复制代码

生成索引类

@BindEventBus
public class MainActivity extends BaseActivity{
    /**
     * 载入view的一些操作
     */
    @Override
    protected void initView() {
        PictureGirl girl = new PictureGirl();
        BaseEvent<PictureGirl> ev = new BaseEvent<>(1,girl);
        EventBusUtil.sendEvent(ev);
    }
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMainActivityEvent(BaseEvent event){
    }
}
复制代码

我们在需要使用到EventBus的对应继承类处添加 @BindEventBus 注解,先实现一个空的事件发送和接收。然后点击 AS 的 build->Rebuild Project,对项目进行编译。

编译结束后,我们可以可以在buid类中找到 MyEventBusIndex

1.webp.jpg

声明添加索引

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //使用订阅索引,加快编译速度
        EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
    }
}
复制代码

使用

惨遭上文 生成索引类处的使用,在对应继承类中加入注解,发送消息时候使用 EventBusUtil 工具类即可



相关文章
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
6天前
|
负载均衡 数据库 开发工具
|
7天前
|
Java 数据库 Maven
谷粒商城笔记+踩坑(1)——架构、项目环境搭建、代码生成器
项目介绍、项目环境搭建、docker配置mysql,redis,jdk,maven、人人开源、快速开发、安装nodejs、逆向工程搭建,人人开源代码生成器
谷粒商城笔记+踩坑(1)——架构、项目环境搭建、代码生成器
|
23天前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
33 5
|
21天前
|
Web App开发 编解码 Linux
FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构
音视频技术广泛应用于直播系统,涵盖电视、电脑、手机直播等多种形式,并延伸至在线教育、医疗咨询和安全监控等领域。直播系统涉及实时编解码与传输,技术实现较复杂。从用户角度看,直播系统分为来源方和观看方,但在开发者视角下还需加入云平台作为中转。本文提出一套基于全开源软件的直播系统架构,分为三层:开源直播录制软件(如OBS Studio、RTMP Streamer),开源流媒体服务器(如SRS、ZLMediaKit),以及开源音视频播放器(如VLC media player、ExoPlayer)。这些组件共同构成一个高效、灵活且成本低廉的直播解决方案。
54 0
FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构
|
25天前
|
JSON API 数据安全/隐私保护
Django 后端架构开发:JWT 项目实践与Drf版本控制
Django 后端架构开发:JWT 项目实践与Drf版本控制
32 0
|
30天前
|
机器学习/深度学习 Cloud Native Serverless
Serverless 架构问题之CNCF基金会托管的CloudEvents项目内容如何解决
Serverless 架构问题之CNCF基金会托管的CloudEvents项目内容如何解决
27 0
|
30天前
|
SQL 分布式计算 大数据
Android项目架构设计问题之平衡技术选型与业务需求之间的关系如何解决
Android项目架构设计问题之平衡技术选型与业务需求之间的关系如何解决
28 0
|
30天前
|
开发工具 Android开发
Android项目架构设计问题之SDK内部减少每次回调时的冗余判断逻辑如何解决
Android项目架构设计问题之SDK内部减少每次回调时的冗余判断逻辑如何解决
17 0
|
30天前
|
开发工具 Android开发
Android项目架构设计问题之外部客户方便地设置回调如何解决
Android项目架构设计问题之外部客户方便地设置回调如何解决
17 0

热门文章

最新文章