Event Bus 源码分析 和apt优化加速

EventBus使用方法 EventBus是一个Android端优化的发布/订阅事件总线,以观察者模式实现,简化了应用程序内各组件间、组件与后台线程间的通信 可以轻易切换线程、开辟线程。主要功能是替代Intent, Handler和BroadCastReceiver在Fragment, Activity, Service和线程之间传递消息。优点是开销小,代码更优雅,将发送者和接收者解耦。... 阅读详情

1、主要内容
EventBus
Subscription
SubscriberMethodFinder
ExecutorService
AsyncPoster
PendingPost
HandlerPoster

android-apt是什么?

android-apt 是一个Gradle插件,协助Android Studio 处理annotation processors, 它有两个目的:

允许配置只在编译时作为注解处理器的依赖,而不添加到最后的APK或library
设置源路径,使注解处理器生成的代码能被Android Studio正确的引用

在app的build.gradle中的 dependencies 中还需要配置eventbus-annotation-processor

apply plugin: 'com.neenbedankt.android-apt'  

....
apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'  

...
apt {  
    arguments {  
        eventBusIndex "com.xxx.XEventBusIndex"  
    }  
}  

...
//在application中将ebindex
EventBus.builder().addIndex(new XEventBusIndex()).installDefaultEventBus();  

1、Eventbus
单例模式: 获取eventbus 工具类

 public static EventBus getDefault() {
        if(defaultInstance == null) {
            Class var0 = EventBus.class;
            synchronized(EventBus.class) {
                if(defaultInstance == null) {
                    defaultInstance = new EventBus();
                }
            }
        }

        return defaultInstance;
    }

2、注册:
注册的处理逻辑
1、根据注册的订阅者获取到class,根据class通过findSubscriberMethods 查找到 Annotation 为Subscribe的method,缓存起来 SubscriberMethod
Subscribe methodName1 = (Subscribe)method.getAnnotation(Subscribe.class);

 public void register(Object subscriber) {
        Class subscriberClass = subscriber.getClass();
        List subscriberMethods =    this.subscriberMethodFinder.findSubscriberMethods(subscriberClass);
        synchronized(this) {
            Iterator var5 = subscriberMethods.iterator();

            while(var5.hasNext()) {
                SubscriberMethod subscriberMethod = (SubscriberMethod)var5.next();
                this.subscribe(subscriber, subscriberMethod);
            }

        }
    }

3、post 发送逻辑:
通过event 查找 event 的订阅者,判断线程状态,最后调用: this.invokeSubscriber(subscription, event); ,如果是异步线程,通过线程池执行AsyncPoster 执行 ,如果运行在主线程,但是post线程非主线程需要通过HandlerPoster切换调用线程。

 public void post(Object event) {
        EventBus.PostingThreadState postingState = (EventBus.PostingThreadState)this.currentPostingThreadState.get();
        List eventQueue = postingState.eventQueue;
        eventQueue.add(event);
        if(!postingState.isPosting) {
            postingState.isMainThread = Looper.getMainLooper() == Looper.myLooper();
            postingState.isPosting = true;
            if(postingState.canceled) {
                throw new EventBusException("Internal error. Abort state was not reset");
            }

            try {
                while(!eventQueue.isEmpty()) {
                    this.postSingleEvent(eventQueue.remove(0), postingState);
                }
            } finally {
                postingState.isPosting = false;
                postingState.isMainThread = false;
            }
        }

    }


.......
private void postToSubscription(Subscription subscription, Object event, boolean isMainThread) {
            switch(null.$SwitchMap$org$greenrobot$eventbus$ThreadMode[subscription.subscriberMethod.threadMode.ordinal()]) {
        case 1:
            this.invokeSubscriber(subscription, event);
            break;
        case 2:
            if(isMainThread) {
                this.invokeSubscriber(subscription, event);
            } else {
                this.mainThreadPoster.enqueue(subscription, event);
            }
            break;
        case 3:
            if(isMainThread) {
                this.backgroundPoster.enqueue(subscription, event);
            } else {
                this.invokeSubscriber(subscription, event);
            }
            break;
        case 4:
            this.asyncPoster.enqueue(subscription, event);
            break;
        default:
            throw new IllegalStateException("Unknown thread mode: " + subscription.subscriberMethod.threadMode);
        }

    }
Android代码-EventBus-Apt EventBus 事件总线 简介 事件总线的思路源于 https://github.com/greenrobot/EventBus 不过代码和实现方式完全不同于EventBus. greenrobot的EventBus是通过 onEvent的方式,然后定义Event实体类 而本项目的代码是通过用户定义IEvent接口,然后apt实现接口负责分发调用注册者的方法,使用者通过这个实现类去调用接口的方法,直接通知注册者 Gradle导入 //eventbus 核心api compile 'com.shizhefei:eventbus-api:1.2.1' //eventbus 注解 compile 'com.shizhefei:eventbus-annotation:1.2.1' 在定义Event接口的Module添加,以便于生成Event接口的代理 annotationProcessor 'com.shizhefei:eventbus-compiler:1.2.1' 在Application初始化 //是否支持跨进程的事件,false表示不支持跨进程 EventBus. 立即下载

相关推荐

DSSP 工具:蛋白质二级结构信息计算与批量处理教程

DSSP(Dictionary of Secondary Structure in Proteins)是一款经典的蛋白质二级结构计算工具,由荷兰癌症研究所(NKI Research)Perrakis 团队维护。它通过分析蛋白质的 PDB 结构文件,能够自动标注每个氨基酸残基的二级结构类型、相对溶剂可及性(暴露面积)等关键信息,为后续的拓扑图绘制、疏水 / 亲水表面分析、二级结构预测模型训练等提供核心数据支持。

good_rrrrr的博客 1835

【Android】EventBus 3.x使用APT提升性能

EventBus 3.0除了支持注解,还有一个鲜为人知的功能,那就是使用APT来搜集SubscriberMethod。这是一个可选的功能,需要额外添加支持。使用APT可以在项目编译期间搜集所有的SubscriberMethod,默认是在运行期间通过反射去搜索subscriber,这样势必存在性能损耗。

devnn的专栏 1377

LWIP协议栈在STM32H7上的内存优化实战:如何用32KB RAM实现稳定千兆以太网通信

本文深入探讨了在STM32H7微控制器上,如何通过内存优化策略,在仅32KB的D2 SRAM中稳定运行LWIP协议栈以实现千兆以太网通信。文章详细分析了STM32H7的内存架构、LWIP的内存消耗瓶颈,并提供了从描述符表与PBUF池精确分配、链接脚本修改到MPU区域划分的一整套实战优化方案,旨在解决大数据量传输卡死等常见配置问题。

gg901的博客 603

深入剖析 Android 开源库 EventBus 的源码详解

在 Android 项目开发的时候,经常会遇到组件与组件之间、组件与后台线程之间的通信, 比如:子线程中进行数据请求,请求数据成功后,通过 Handler、RxJava 等来通知 UI 主线程进行更新操作;两个 Fragment 之间可以通过 Listener 进行通信,简单的通信通过上述的技术手段也是可以满足需求的,但随着项目的不断迭代更新,程序越来越庞大时,就会要写很多的代码,从而导致代码严重的耦合问题。为了优化该问题,EventBus 事件总线应运而生。

neuHenry 1667

TensorRT-LLM环境配置避坑指南:从安装到实战

本文是一份详尽的TensorRT-LLM环境配置避坑指南。文章重点解析了从Python、CUDA、PyTorch版本选择,到解决mpi4py安装这一核心难题的完整流程,并提供了经过验证的稳定版本组合与实战排错方案,帮助开发者高效部署大语言模型推理优化环境。

a0b1c2d3的专栏 983

windows中如何将已安装的nodejs高版本降级为低版本

第一步:先清空本地安装的node.js版本 1.按健win+R弹出窗口,键盘输入cmd,然后敲回车(或者鼠标直接点击电脑左面最左下角的win窗口图标弹出,输入cmd再点击回车键) 然后进入命令控制行窗口,并输入where node查看之前本地安装的node的路径 2.找到上面找到的路径,将node.exe所在的父目录里面的所有东西都删除 3.为了彻底删除之前安装的node.js,鼠标点击电脑左面最左下角的win窗口图标弹出,输入“控制面板”再点击回车键进入,进入控制面板后,找到所安装的node.js并

weixin_44582077的博客 9万+

EventBus 的源码集成实践,如何将EventBus源码修改包名,并将atp集成到自己的项目中

EventBus atp 源码引入集成,APT源码集成,定义自己的包名路径,避免与接入冲突

qq_19942717的博客 741

手把手教你用yt-dlp批量下载YouTube视频数据集(附TikTok/Kaggle资源)

本文提供了一份构建视频数据集的实战指南,重点介绍了使用yt-dlp工具批量下载YouTube视频的高级技巧,包括环境配置、批量参数设置与自动化脚本。同时,文章还整合了TikTok、Kaggle及学术开源数据集等多源高质量视频资源,并分享了数据清洗、格式统一与管理的完整流程,帮助研究者和开发者高效获取与处理训练数据。

weixin_29057237的博客 289

EventBus的使用以及优化

EventBus理解以及替代EventBus的LivedataBus实现。

LX_52Hz的博客 1038

从二体运动到高精度轨道:STK与MATLAB联动的轨道外推算法演进史

本文探讨了轨道外推算法从二体运动到高精度轨道预报(HPOP)的演进历程,重点分析了STK与MATLAB协同仿真环境下的技术实现与应用。通过对比不同算法的精度与适用场景,展示了HPOP在卫星参数优化和轨道设计中的优势,为航天任务规划提供了高效解决方案。

weixin_29082143的博客 697

在 SAP HANA 与 HANA Cloud 中,用 SQL DDL 创建数据库视图:从设计时工件到运行时对象的全链路实践

本文介绍了在SAP HANA中通过HDI容器使用DDL定义视图的方法。主要内容包括:1)采用.hdbview设计时工件存储视图定义,构建时自动转换为运行时视图,实现版本控制和权限隔离;2)开发前需准备HDI容器、MTA项目及配置.hdiconfig文件;3)详细说明.hdbview语法结构,重点讲解WITH READ ONLY和WITH STRUCTURED PRIVILEGE CHECK的使用场景;4)提供了从创建文件到构建验证的完整流程示例;5)强调跨容器访问时需通过.hdbgrants为#OO用户授予

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 269

APT 软件源与 Wget 原理全解析:分类、区别与核心概念

(Advanced Package Tool)是用于管理。在 Debian 和 Ubuntu 系统中,:APT 软件源就像“应用商店”,当你运行。时,系统会去这些源查找并下载软件。,确保安装的软件包完整无误。(GNU Wget)是一个。,用于从远程服务器下载文件。

Interview_TC的博客 1410

7、布尔网络的基础定义

本文介绍了布尔网络的基础定义及其在系统生物学中的应用。布尔网络是一种描述复杂系统动态行为的数学模型,由布尔变量和布尔函数组成,能够模拟生物系统中基因调控、信号传导和细胞代谢等过程。文章详细阐述了布尔网络的基本结构、动力学特征(如状态转移图和吸引子),以及其在生物建模中的重要价值,并探讨了优化和简化技术(如Backward Boolean Equivalence)如何提升其计算效率。

yhn45678901的博客 262

Butterknife和 EventBus 使用apt冲突

今天在做小项目的时候突然发现删掉一些控件时编译出错了,控件已经删的干干净净,可是还是报错。 就在这个类编译时出错了,控件已经删了,但是这个类没有更新,导致找不到对应的控件,这个类是BufferKnife在编译时自动生成的类,所以想到是Butterknife编译注解时出错了。回想了一下是因为加入了EventBus框架之后的事,当时添加EventBus依赖时是跟着官网的说明在gradle文件中添

zz276203200的博客 1108

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

EventBus3.0配置及使用

一、前言        EventBus是Android中组件与组件之间通信的框架,可以解耦和简化Activity与Activity、Activity和Fragment、Fragment和Fragment之间的通信。        详情可移步至:     github地址:https://github.com/greenrobot/EventBus     官方文档:http://greenrob...

阿飞的博客 5022

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

EventBus3.0源码分析(一)两种使用方式

EventBus在3.0及以上版本中加入了以APT(Annotation Processing Tool)实现的方式,但他还是保留了之前反射的实现方式。下面将展示两种实现方式使用上的区别。

qq_27246079的博客 896

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

基于LiveData,实现eventBus,事件统一管理,动态APT生成,生命周期管理

github:https://github.com/codyer/LiveEventBus # LiveEventBus 基于LiveData,实现eventBus,事件统一管理,动态APT生成,生命周期管理 ## 特点 - [x] 整个生命周期(从onCreate到onDestroy)都可以实时收到消息 - [x] 激活状态(Started)可以实时收到消息,非激活状态(Stoped)...

666

EventBus3.0使用详解

这里所介绍的EventBus指的是greenrobot的EventBus,它是一款针对Android的发布/订阅事件总线。它能够让我们很轻松的实现在Android的各个组件以及线程之间进行传递消息。并且将事件的发送者与接收者之间进行解耦。而且他还是轻量级的Android类库。对于EventBus3.0中相对于先前的版本中用法有所改变,那么下面我们就来看一下如何使用这个EventBus;

李江东 1万+

Android中EventBus原理及用法详情

EventBus概述EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅。以及将发送者和接收者解耦。比如请求网络,等网络返回时通过Handle

移动开发Android 923

EventBus原理详解

在EventBus 3.0 使用介绍 这篇博客中介绍了关于EventBus的一些使用方法,下面我们就来看看它内部的具体实现吧!流程图先来一张整体流程图: 思路图在看看register 和 post 的过程思路图:registerpost通过上面的几张图,我们可以大致了解eventbus的工作流程,下面我们在来介绍一下这个流程中比较重要的几个方法重要的方法register中重要的方法 Lis

Yigit_dev的博客 4732

DataBinding eventbus butterknife 使用apt的冲突

DataBinding eventbus butterknife一起用会因为apt的原因冲突,一个解决方案就是就把注解编译android-apt切换到annotationProcessor在project的build.gradle 里面不用把以前的apt的都删掉,就留一个 classpath 'com.android.tools.build:gradle:2.3.0'在module的gradle里

u011094768的博客 2281

EventBus

上文我自己写了一个观察者+反射的框架,最后发现EventBus的包体积其实不大,然后他性能优化上又作了许多措施,最终决定采用EventBus基本使用//api 'org.greenrobot:eventbus:3.1.1'private static final String TAG = "xbh"; @Override protected void onCreate(Bundle savedI...

qq_36523667的博客 416

可能你的EventBus使用并不正确,是时候真正搞懂EventBus了(下)

在上一篇文章中可能你的EventBus使用并不正确,是时候真正搞懂EventBus了(上),我们说了使用apt方式进行优化使用eventbus,并对EventBus#register和EventBus#unRegister方法进行了说明。对这块内容不熟悉的,可以先看下在继续看下面的内容。 本节内容将讲解剩下的内容,包括了EventBus#post、粘性事件等。 1、EventBus#post(Object event) 之前说了,register的时候,会将查找到的添加的注解的方法进行查找,并保存。这节将讲

步行者 834

30分钟学会EventBus3.0详解(一)(引入和初始化EventBus3.0)(by星空武哥)

转载声明原创地址:http://blog.youkuaiyun.com/lsyz0021/article/details/51985307 30分钟学会EventBus3.0详解(一)(引入和初始化EventBus3.0) 30分钟学会EventBus3.0详解(二)(EventBus3.0的详细使用) 前言 EventBus是greenrobot出品的非常优秀的基于发布、订阅模式的一套框架,

星空武哥的专栏 1万+
上一篇: 360APP加固软件使用
下一篇: java中Keytool的使用总结
doubleping
博客等级 码龄17年 23粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值