EventBus之Subscriber Index

2023-12-15 14:58
文章标签 index subscriber eventbus

本文主要是介绍EventBus之Subscriber Index,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Subscriber Index

订阅者索引是EventBus 3的一个新特性。这是一个可选的优化,以加快初始订阅者注册。

Subscriber Index在编译时(build time)使用EventBus注解处理器(annotation processor)创建。虽然不是必须要使用索引,但建议在Android上使用索引以获得最佳性能。

Index Preconditions

注意,只能为订阅者和事件类为公共的(subscriber AND event class are public)@Subscriber方法建立索引。此外,由于Java注解处理(annotation process)本身的技术限制,@Subscribe注解不能在匿名类中识别(not recognized inside of anonymous classes)。

当EventBus不能使用索引时,它将在运行时(run time)自动回退到(fallback to)反射(reflection)。因此它仍然可以工作,只是稍微慢一点。

EventBusBuilder有一些默认属性,有一个属性为ignoreGeneratedIndex,这个属性为true时会使用反射方法获取订阅者的事件处理函数,为false时会使用subscriber Index生成的SubscriberInfo来获取订阅者的事件处理函数,首先,Subscriber Index会在编译期间生成SubscriberInfo,然后在运行时使用SubscriberInfo中保存的事件处理函数处理事件,减少了反射时需要的耗时,会有运行速度上的提升。

如何生成索引(How to generate the index)

使用annotationProcessor

如果您不使用Android Gradle插件版本2.2.0或更高版本,请使用 Android-apt 配置。

要启用索引生成,您需要使用 annotationProcessor 属性将EventBus注释处理器添加到构建中。还可以设置参数eventBusIndex来指定要生成的索引的完全限定类。例如,添加以下部分到您的Gradle构建脚本:


android {defaultConfig {javaCompileOptions {annotationProcessorOptions {arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ]}}}
}dependencies {implementation 'org.greenrobot:eventbus:3.1.1'annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
}

使用kapt

如果你想在Kotlin代码中使用EventBus,你需要使用kapt而不是annotationProcessor:
 

apply plugin: 'kotlin-kapt' // ensure kapt plugin is applieddependencies {implementation 'org.greenrobot:eventbus:3.1.1'kapt 'org.greenrobot:eventbus-annotation-processor:3.1.1'
}kapt {arguments {arg('eventBusIndex', 'com.example.myapp.MyEventBusIndex')}
}

使用android-apt

如果上面的方法不起作用,您可以使用 android-apt Gradle插件将EventBus注释处理器添加到构建中。添加以下部分到您的Gradle构建脚本:

buildscript {dependencies {classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'}
}apply plugin: 'com.neenbedankt.android-apt'dependencies {compile 'org.greenrobot:eventbus:3.1.1'apt 'org.greenrobot:eventbus-annotation-processor:3.1.1'
}apt {arguments {eventBusIndex "com.example.myapp.MyEventBusIndex"}
}

如何使用索引

成功构建项目之后,将为您生成eventBusIndex指定的类。然后当设置EventBus时,像这样传递它:

EventBus eventBus = EventBus.builder().addIndex(new MyEventBusIndex()).build();

或者,如果你想在整个应用程序中使用默认实例:

EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
// Now the default instance uses the given index. Use it like this:
EventBus eventBus = EventBus.getDefault();

 MyEventBusIndex的路径为:项目根目录\build\generated\source\apt\debug\包名\MyEventBusIndex.java

Indexing your Libraries

您可以将相同的原理应用于作为类库的一部分的代码(而不仅是主的应用程序(and not the final application))。这样,你可能有多个索引类,你可以在EventBus设置(setup)过程中添加,例如:

EventBus eventBus = EventBus.builder().addIndex(new MyEventBusAppIndex()).addIndex(new MyEventBusLibIndex()).build();

GitHub地址

由于作者水平有限,语言描述及代码实现中难免有纰漏,望各位看官多提宝贵意见!

Hello , World !

感谢所有!

这篇关于EventBus之Subscriber Index的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/496849

相关文章

IEEE会议投稿资料汇总http://cadcg2015.nwpu.edu.cn/index.htm

最近投了篇IEEE的顶级会议文章,一下是比较有用的一些资料,以供参考。 1.会议主页:http://cadcg2015.nwpu.edu.cn/index.htm     (The 14th International Conference on Computer-Aided Design and Computer Graphics (CAD/Graphics 2015)) 2.I

INDEX+SMALL+IF+ROW函数组合使用解…

很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP、INDEX+MATCH中入门的,纵然你把全部的多条件查找方法都学会了而且运用娴熟,如VLOOKUP和&、SUMPRODUCT、LOOKUP(1,0/....,但仍然只能对这种一对多的查询望洋兴叹。   这里讲的INDEX+SMALL+IF+ROW的函数组合,

CTFHub技能树-Git泄漏-Index

目录 一、Git索引(Index)的基本概念 二、解题过程 主旨:使用git泄漏恢复源代码 方法一:使用GitHack手动恢复 方法二:直接使用Git_Extract获取网站源代码拿去flag   当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的Gi

android.database.CursorIndexOutOfBoundsException: Index 5 requested, with a size of 5

描述: 01-02 00:13:43.380: E/flyLog:ChatManager(963): getUnreadChatGroupandroid.database.CursorIndexOutOfBoundsException: Index 5 requested, with a size of 5 01-02 00:13:43.380: E/flyLog:ChatManager(

关于OceanBase MySQL 模式中全局索引 global index 的常见问题

在OceanBase的问答区和开源社区钉钉群聊中,时常会有关于全局索引 global index的诸多提问,因此,借这篇博客,针对其中一些普遍出现的问题进行简要的解答。 什么是 global index ? 由于 MySQL 不具备 global index 的概念,因此这一问题会经常被社区版用户提及。就在前几天,就要人询问下面这个语法的意义。 create table part_tes

运行PHP程序时提示“Notice: Undefined index”的解决办法

最近在调试网站程序的时候,不知道怎么经常出现“Notice:Undefined index”的提示,程序又可以正常运行,就是看到这个提示感觉有点不爽,把模板搞乱了,经查其实这个不是错误,是警告。如果服务器不能改,那每个变量使用前应当先定义。怎么样解决呢?很多网友的说法不一致,程序不一样你也根本没办法照着解决,要是自己慢慢研究的话一大堆代码得半天试,在这里提供一个最简单有效经本人测试有效的办法给大家

【硬刚ES】ES基础(十三)Dynamic Template和Index Template

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

mysql 的函数用法SUBSTRING_INDEX

因为数据库的数据要更新操作,内容是这样的: 这是之前的数据,现在因为需求变更,只需要横杠之前的数据,数据量少可以手动改,但是有几百条的数据,所以找到了一个方法 UPDATE product SET pro_price=SUBSTRING_INDEX(pro_price, '-', 1);  这个SUBSTRING_INDEX就是用来截取的 pro_price是要修改的字段名,然后中间

elasticsearch 2.3.4 java API 连接,ik分词器,设置集群节点,创建index,mapping的几种方式

1、默认集群连接 Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 2、自定义集群连接 Settings settings = S

EventBus-Vue事件总线解析与使用指南

前言         在Vue.js中,组件通信是开发过程中非常场景的需求。根据不同的场景和需求,Vue提供了多种组件通信方式。比如父子组件通信、兄弟组件通信、跨代组件通信等。当应用程序中两个组件或者说页面之间没有引入和被引入的关系的时,或者说他们之间嵌套的结果复杂的时候,我们可以考虑如何传递数据呢?         其中适用的通信方式有 Vuex、provide 和 inject、Event