EventBus

EventBus    

EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCastFragmentActivityService,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

工作:订阅者订阅事件到总线,发送者发布事件。

订阅者可以订阅多个事件,

发送者可以发布任何事件,

发布者同时也可以是订阅者。

EventBus.getDefault().register(this);//订阅事件

EventBus.getDefault().post(object);//发布事件

EventBus.getDefault().unregister(this);//取消订阅

methodName 这个是写死的:“onEvent”,用于确定扫描什么开头的方法,可见我们的类中都是以这个开头。

priority 优先级,优先级越高,在调用的时候会越先调用。

@Subscribe(priority = 1)

public void onEvent(MessageEvent event) {

  …

}

{012}和线程优先级一样

  • PostThread 默认实现,执行发生在同一个线程
  • MainThread 执行在UI 线程上
  • BackgroundThread 回调发生在非 UI 线程上
  • Async 永远执行在一个其他的线程上

黏性事件sticky 

除了上面讲的普通事件外,EventBus还支持发送黏性事件。何为黏性事件呢?简单讲,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。

订阅黏性事件:

EventBus.getDefault().register(StickyModeActivity.this);

黏性事件处理函数:

@Subscribe(sticky = true)

public void XXX(MessageEvent messageEvent) {

    ......

}

坑:

1、若使用EventBus时出现异常:Subscriber class *** and its super classes have no public methods with the @Subscribe annotation

报错的原因:使用EventBus的方法不是public,且缺少@Subscribe这个注解。

按照提示改为public,并且加上@Subscribe这个注解就Ok


2、若收不到事件,比如在Activityoncreat中发送事件,在Fragment中的oncreat中接收事件,可能是因为发送事件时Fragment还未注册EventBus


3、发送事件的类是不需要注册的,只有接收事件的类需要注册;注意要记得在合适时机取消注册。

4.消息的接收是根据参数中的哦object类名来决定执行哪一个的(每种事件都必须自定义一个事件类,造成事件类太多)

3.0之前,EventBus还没有使用注解方式。消息处理的方法也只能限定于onEventonEventMainThreadonEventBackgroundThreadonEventAsync,分别代表四种线程模型。而在3.0之后,消息处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为PostThread

内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编写能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
### 关于EventBus的使用教程 EventBus 是一种用于简化 Android 应用程序中事件传递机制的开源库。它允许组件之间通过发布-订阅模式进行通信,而无需显式的接口定义或回调函数。 #### 基本使用方法 要发送一个事件,可以使用 `EventBus.getDefault().post()` 方法[^2]。例如: ```java // 发送简单字符串事件 EventBus.getDefault().post("Hello World!"); ``` 如果需要发送更复杂的对象作为事件,则可以通过创建自定义类来封装数据并将其作为参数传入 `post` 方法[^1]。如下所示: ```java // 创建消息事件类 public class MessageEvent { private String message; public MessageEvent(String msg){ this.message = msg; } public String getMessage(){ return message; } } // 发布消息事件 EventBus.getDefault().post(new MessageEvent("Hello EventBus!")); ``` 对于接收端而言,首先需要注册该活动或者片段以便它可以监听这些发布的事件[^4]。通常推荐在 Activity 或 Fragment 生命周期中的适当位置完成此操作(比如 onStart 和 onStop)。下面是一个例子展示如何设置以及响应上述类型的事件: ```java @Override protected void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override protected void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { Log.d("TAG", "Received message:" + event.getMessage()); } ``` #### 粘性事件的支持 当应用涉及到某些特定场景下可能希望即使当前没有订阅者也能保留最近一次发生的事件供后续加入的新订阅者获取时就可以考虑采用粘贴型事件(sticky events)。其主要区别在于发送的时候要用到 `postSticky` 而不是普通的 post 函数;另外,在相应的处理器前面加上注解属性 `sticky=true`. ```java // 发送粘性事件 EventBus.getDefault().postSticky(new MovieEvent(1)); // 接收处理粘性事件 @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void handleMovieEvent(MovieEvent event) { int count = event.getCount(); } ``` ### 实现原理概述 内部实现上,EventBus 利用了 Java 反射技术动态查找目标实例上的标记了 @Subscribe 注解的方法,并依据指定条件匹配合适的调用时机。每当有一个新事件被投递进来之后,就会触发对应已登记过的观察者的相应动作执行过程。此外还存在多线程支持功能,这背后依赖的是 ExecutorService 来管理异步任务调度流程[^5]。 ### GitHub项目地址 可以从官方仓库克隆最新版本代码下来研究学习更多细节: ```bash git clone https://github.com/greenrobot/EventBus.git ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值