EventBus定义

EventBus 是Greenrobot开源的一款轻量级的发布/订阅事件总线。

EventBus-Publish-Subscribe.png

Publisher方发布Event事件

Subciber方响应事件,执行响应函数onEvent()

优点

简化组件之间的通信,在Activitys, Fragments,和后台线程中都表现良好。

避免复杂且容易出错的依赖关系和生命周期问题

如何使用:

1 定义事件:

public static class MessageEvent { /* Additional fields if needed */ }

2 在你需要响应事件的地方定义Subscribe函数。添加@Subscribe注解和threadMode 类型(后面会详情介绍threadMode)

@Subscribe(threadMode = ThreadMode.MAIN)

public void onMessageEvent(MessageEvent event) {/* Do something */};

3 在你的Subscribe函数所在组件的生命周期函数中执行注册和注销函数

@Override

public void onStart() {

super.onStart();

EventBus.getDefault().register(this);

}

@Override

public void onStop() {

super.onStop();

EventBus.getDefault().unregister(this);

}

4 发送事件

EventBus.getDefault().post(new MessageEvent());

ThreadMode

EventBus共包括4种模式:

POSTING:在post所在线程执行

MAIN:在主线程(UI thread)中执行

BACKGROUND:在后台线程中执行,适合耗时短的处理

ASYNC:在单独线程中执行,适合耗时较长的处理

源码分析

void register(Object subscriber)

register()解析当前subscriber的class,获取所有Subscribe 函数,保存到对应的events的map中。

subscriberMethodFinder是其负责解析class的辅助函数。

Class> subscriberClass = subscriber.getClass();

List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);

synchronized (this) {

for (SubscriberMethod subscriberMethod : subscriberMethods) {

subscribe(subscriber, subscriberMethod);

}

}

保存在subscriptionsByEventType中,字典类型,Event class 和 subscription list集合一一对应。

private final Map, CopyOnWriteArrayList> subscriptionsByEventType;

void post(Object event)

post 发送event到EventBus的eventQueue。

PostingThreadState postingState = currentPostingThreadState.get();

List eventQueue = postingState.eventQueue;

eventQueue.add(event);

发送队列里的所有event

while (!eventQueue.isEmpty()) {

postSingleEvent(eventQueue.remove(0), postingState);

}

获取event的所有subscriber 函数

CopyOnWriteArrayList subscriptions;

synchronized (this) {

subscriptions = subscriptionsByEventType.get(eventClass);

}

根据threadModel类型,执行subscriber 函数

......

case POSTING:

invokeSubscriber(subscription, event);

break;

case MAIN:

if (isMainThread) {

invokeSubscriber(subscription, event);

} else {

mainThreadPoster.enqueue(subscription, event);

}

break;

......

反射方式执行:

void invokeSubscriber(Subscription subscription, Object event) {

try {

subscription.subscriberMethod.method.invoke(subscription.subscriber, event);

} ......

}

异步线程处理:EventBus内部维护一个线程池负责处理

private final static ExecutorService DEFAULT_EXECUTOR_SERVICE = Executors.newCachedThreadPool();

ExecutorService executorService = DEFAULT_EXECUTOR_SERVICE;

总结:

EventBus 使用非常简单,代码结构非常清晰,非常方便阅读,值得学习。

android eventbus 使用,Android之EventBus使用与分析相关推荐

  1. android如何app主题更换,通过EventBus更换android app主题

    在设置界面切换主题,是许多app必备的功能,可以在style.xml文件中写好样式,然后在代码中使用setTheme()可以动态切换整个application的主题.具体步骤: 1.准备好要切换的st ...

  2. Android 框架学习1:EventBus 3.0 的特点与如何使用

    前面总结了几篇基础,在这过程中看着别人分享自定义 View.架构或者源码分析,看起来比我写的"高大上"多了,内心也有点小波动. 但是自己的水平自己清楚,基础不扎实画再多源码流程图也 ...

  3. android eventbus使用,Android EventBus使用详解(一)

    前言 EventBus是一种用于Android的发布/订阅事件总线.它有很多优点:简化应用组件间的通信:解耦事件的发送者和接收者:避免复杂和容易出错的依赖和生命周期的问题:很快,专门为高性能优化过等等 ...

  4. android 常用混淆,Android常用的代码混淆整理【原创】

    android里的代码混淆是比不可少的东西,下面就贴一些常用的代码混淆. #指定代码的压缩级别 -optimizationpasses 5 #包明不混合大小写 -dontusemixedcasecla ...

  5. 【EventBus】EventBus 源码解析 ( EventBus 构建 | EventBus 单例获取 | EventBus 构造函数 | EventBus 构建者 )

    文章目录 一.EventBus 单例获取 二.EventBus 构造函数 三.EventBus 构建者 一.EventBus 单例获取 在 EventBus 中 , 不论是进行注册 , 取消注册 , ...

  6. android开发模式,Android开发中无处不在的设计模式

    Android开发中无处不在的设计模式――单例模式 Android开发中无处不在的设计模式――Builder模式 前面介绍了单例模式和Builder模式,有兴趣的见上面两个链接,这篇文章侧重介绍1下视 ...

  7. android实现过程,Android:一个完整app开发流程

    一.给出功能文档 二.APP架构选择 可选MVP,MVVM 三.APP目录结构设置 本app基于mvp架构.除了mvp架构的文件. 还包含下面的文件夹: ui (下面根据Activity划分) wid ...

  8. Android开发之Android性能优化记录

    Android 性能优化 Android 中的性能优化在我看来分为以下几个方面:内存优化.布局优化.网络优化.安装包优化: 内存优化: 下一个问题就是: 布局优化: 布局优化的本质就是减少 View ...

  9. android fragment面试,Android fragment之间传递数据的方式?

    方法一: 1.在MainFragment中设置一个setData()方法,在方法中设置更改按钮名称; //MainFragment.java文件中public void setData(String ...

  10. android购物车栏,Android怎么实现二级列表购物车功能

    Android怎么实现二级列表购物车功能 发布时间:2021-04-16 12:45:40 来源:亿速云 阅读:61 作者:小新 小编给大家分享一下Android怎么实现二级列表购物车功能,希望大家阅 ...

最新文章

  1. 《大数据实践课》开创实践教学新模式:清华大数据能力提升项目特色课程系列报道之一
  2. PANS最新脑神经科学研究:激活一种新语言并不费力气
  3. jquery隐藏表格行
  4. nginx的反向代理及负载均衡
  5. nyc检测Javascript代码覆盖率
  6. mysql replication 协议_深入解析MySQL replication协议
  7. 临危不乱,.Net+IIS环境经常出现的问题及排障。(转)
  8. mysql schema设计_mongodb 的 schema 设计方法
  9. 基于netty的微服务架构
  10. ZZULIOJ 1053:正弦函数
  11. 捕捉Web页面子类错误堆栈中的信息
  12. 【机器人】人类反应与机器的浑然一体—营救机器人诞生
  13. 九、模型文档编辑器(生成项目文档)
  14. Oracle开发:常用的数据库字段类型[转]
  15. MySQL 5.6版本二进制包多实例安装
  16. 深入理解java虚拟机 - 垃圾回收机制(GC)
  17. MATLAB程序设计-1.MATLAB简介
  18. Masscan:最快的互联网IP端口扫描器
  19. 2018中原工学院网络安全校赛
  20. Linux详细安装教程(Centos)

热门文章

  1. sklearn回归 预测下一期双色球
  2. 10-142 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格
  3. 拓嘉辰丰:高价位的商品是否适合拼多多平台
  4. 视频教程-跨平台APP JQuery Mobile开发-jQuery
  5. 计算机关闭还漏电什么情况,电脑主机漏电的原因及解决方法
  6. P1425_小鱼的游泳时间
  7. 合宙esp32+显示屏测试
  8. excel找到一列数中最大数的位置
  9. 如何使用 Google Colab (或其他 python 笔记本)读取谷歌硬盘的文件
  10. Python爬取重点产业专利信息网(仅供学习交流!!)