EventBus总结(原)
1、EventBus的作用
EventBus is a publish/subscribe event bus for Android and Java.
EventBus可以被用来在各种自定义的监听事件中使用,包括不限于Activity、Fragment、Service等等等等需要进行数据传递的地方,不过应该只局限于app内部。
2、EventBus的原理


EventBus是一个典型的事件分发器,Observer模式。订阅者被集中到EventBus类中,当发布者通过post MessageEvent时,通知到订阅者。
3、EventBus的实现

将订阅者注册到EventBus时,EventBus通过SubscriberMethodFinder反射扫描annotation @Subscribe,将注册者中的通知方法都存储在结构体中并返回给EventBus中的
subscriptionsByEventType结构体,这个结构体根据自定义的消息类型进行map存入,并且将该订阅者所有的自定义消息类型都放入结构体typesBySubscriber中。
当发布自定义的消息时,EventBus从subscriptionsByEventType结构体中取出对应的消息method,invoke对应方法。
当移除订阅者时,根据此订阅者检索typesBySubscriber,从subscriptionsByEventType结构体中移除所有该订阅者的方法。
4、EventBus的流程(此图看不清时请下载或者放大查看)

5、EventBus的使用
5.1 定义订阅者需要传递的消息类型;对于不同的功能要定义不同的消息,同一个订阅者可以存在不同的消息类型;
5.2 在订阅者中使用@Subscribe注解方法,方法一定要是public | (Modifier.ABSTRACT | Modifier.STATIC | BRIDGE | SYNTHETIC);
5.3 将订阅者注册到EventBus,可以使用EventBus的builder方法或者EventBusBuilder进行EventBus的定制;
5.4 post方法将自定义消息推送到订阅者;注意,由于在EventBus中使用了ThreadLocal的list,更好的支持多线程操作;而post时选择的最终消息推送线程,则由@Subscribe的注解方法中的参数ThreadMode决定;
5.5 注意要在不使用时unregister订阅者;
5.6 具体代码可参考EventBus github页面。 (https://github.com/greenrobot/EventBus)
Define events:
public static class MessageEvent { /* Additional fields if needed */ }Prepare subscribers: Declare and annotate your subscribing method, optionally specify a thread mode:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};Register and unregister your subscriber. For example on Android, activities and fragments should usually register according to their life cycle:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
} @Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}Post events:
EventBus.getDefault().post(new MessageEvent()); that's ok.
EventBus总结(原)的更多相关文章
- EventBus使用详解(一)——初步使用EventBus
一.概述 EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间 ...
- EventBus源码解析
用例 本文主要按照如下例子展开: //1. 新建bus对象,默认仅能在主线程上对消息进行调度 Bus bus = new Bus(); // maybe singleton //2. 新建类A(sub ...
- android EventBus详解(二)
上一节讲了EventBus的使用方法和实现的原理,下面说一下EventBus的Poster只对粘滞事件和invokeSubscriber()方法是怎么发送的. Subscribe流程 我们继续来看Ev ...
- Rafy中的EventBus
EventBus主要是干嘛使的,直接翻译叫事件总线. 是观察者模型的实现,利用它你既可以实现观察者模型的业务场景,还可以基于它的事件驱动机制来实现应用程序内组件之间的解耦与通信. 我们来看看有Even ...
- 基于.NetStandard的简易EventBus实现-基础实现
一.问题背景 最近离职来到了一家新的公司,原先是在乙方工作,这回到了甲方,在这一个月中,发现目前的业务很大一部分是靠轮询实现的,例如:通过轮询判断数据处于B状态了,则轮询到数据后执行某种动作,这个其实 ...
- ABP vNext EventBus For RabbitMQ 分布式事件总线使用注意事项_补充官网文档
[https://docs.abp.io/zh-Hans/abp/latest/Distributed-Event-Bus-RabbitMQ-Integration](ABP vNext官方文档链接) ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
随机推荐
- 前端每日实战:47# 视频演示如何用纯 CSS 创作一个蝴蝶标本展示框
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xzgZzQ 可交互视频教程 此视频 ...
- python基础:10.多线程装饰器模式下的单例模式
with def __enter__ def __close__ 闭包: 装饰器: 闭包的延迟绑定: 单例模式的应用:
- java Map的四种遍历方式
1.这是最常见的并且在大多数情况下也是最可取的遍历方式,在键值都需要时使用. Map<Integer, Integer> map = new HashMap<Integer, Int ...
- IntelliJ IDEA 代码调式
Mute Breakpoints: 保留所有断点,但是不执行(程序一次性执行). Condition: 条件触发 即当执行到i的值变为5的时候,在断点处暂停.
- C++ LinearRegression代码实现
这里基本完全参考网络资源完成,有疑问欢迎留言! LinearRegression.h #pragma once #ifndef ML_LINEAEEEGRESSION_H #define ML_LIN ...
- Yii2 kineditor
用 kineditor实现异步 <table cellspadding=5 width=400> <tr height='150'> <td valign="t ...
- Ant Design Pro (中后台系统)教程
一.概念:https://pro.ant.design/docs/getting-started-cn(官方网站) 1.Ant Design Pro 是什么: https://www.cnblogs ...
- 31 July
P1005 矩阵取数游戏 高精度不能更坑-- #include <cstdio> #include <cstring> struct INT { long long h, l; ...
- [CSP-S模拟测试]:Walk(BFS+建边)
题目描述 在比特镇一共有$n$个街区,编号依次为$1$到$n$,它们之间通过若干条单向道路连接. 比特镇的交通系统极具特色,除了$m$条单向道路之外,每个街区还有一个编码${val}_i$,不同街区可 ...
- [CSP-S模拟测试]:Read(数学)
题目描述 热爱看书的你有$N$本书,第$i$本书的种类为$A[i]$.你希望每天能够看一本书,但是不希望连续两天看种类相同的书.为了达成这个条件,你需要选择一些书不看,作为一个好学生,你希望不看的书尽 ...