android eventbus 使用,Android之EventBus使用与分析
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使用与分析相关推荐
- android如何app主题更换,通过EventBus更换android app主题
在设置界面切换主题,是许多app必备的功能,可以在style.xml文件中写好样式,然后在代码中使用setTheme()可以动态切换整个application的主题.具体步骤: 1.准备好要切换的st ...
- Android 框架学习1:EventBus 3.0 的特点与如何使用
前面总结了几篇基础,在这过程中看着别人分享自定义 View.架构或者源码分析,看起来比我写的"高大上"多了,内心也有点小波动. 但是自己的水平自己清楚,基础不扎实画再多源码流程图也 ...
- android eventbus使用,Android EventBus使用详解(一)
前言 EventBus是一种用于Android的发布/订阅事件总线.它有很多优点:简化应用组件间的通信:解耦事件的发送者和接收者:避免复杂和容易出错的依赖和生命周期的问题:很快,专门为高性能优化过等等 ...
- android 常用混淆,Android常用的代码混淆整理【原创】
android里的代码混淆是比不可少的东西,下面就贴一些常用的代码混淆. #指定代码的压缩级别 -optimizationpasses 5 #包明不混合大小写 -dontusemixedcasecla ...
- 【EventBus】EventBus 源码解析 ( EventBus 构建 | EventBus 单例获取 | EventBus 构造函数 | EventBus 构建者 )
文章目录 一.EventBus 单例获取 二.EventBus 构造函数 三.EventBus 构建者 一.EventBus 单例获取 在 EventBus 中 , 不论是进行注册 , 取消注册 , ...
- android开发模式,Android开发中无处不在的设计模式
Android开发中无处不在的设计模式――单例模式 Android开发中无处不在的设计模式――Builder模式 前面介绍了单例模式和Builder模式,有兴趣的见上面两个链接,这篇文章侧重介绍1下视 ...
- android实现过程,Android:一个完整app开发流程
一.给出功能文档 二.APP架构选择 可选MVP,MVVM 三.APP目录结构设置 本app基于mvp架构.除了mvp架构的文件. 还包含下面的文件夹: ui (下面根据Activity划分) wid ...
- Android开发之Android性能优化记录
Android 性能优化 Android 中的性能优化在我看来分为以下几个方面:内存优化.布局优化.网络优化.安装包优化: 内存优化: 下一个问题就是: 布局优化: 布局优化的本质就是减少 View ...
- android fragment面试,Android fragment之间传递数据的方式?
方法一: 1.在MainFragment中设置一个setData()方法,在方法中设置更改按钮名称; //MainFragment.java文件中public void setData(String ...
- android购物车栏,Android怎么实现二级列表购物车功能
Android怎么实现二级列表购物车功能 发布时间:2021-04-16 12:45:40 来源:亿速云 阅读:61 作者:小新 小编给大家分享一下Android怎么实现二级列表购物车功能,希望大家阅 ...
最新文章
- 《大数据实践课》开创实践教学新模式:清华大数据能力提升项目特色课程系列报道之一
- PANS最新脑神经科学研究:激活一种新语言并不费力气
- jquery隐藏表格行
- nginx的反向代理及负载均衡
- nyc检测Javascript代码覆盖率
- mysql replication 协议_深入解析MySQL replication协议
- 临危不乱,.Net+IIS环境经常出现的问题及排障。(转)
- mysql schema设计_mongodb 的 schema 设计方法
- 基于netty的微服务架构
- ZZULIOJ 1053:正弦函数
- 捕捉Web页面子类错误堆栈中的信息
- 【机器人】人类反应与机器的浑然一体—营救机器人诞生
- 九、模型文档编辑器(生成项目文档)
- Oracle开发:常用的数据库字段类型[转]
- MySQL 5.6版本二进制包多实例安装
- 深入理解java虚拟机 - 垃圾回收机制(GC)
- MATLAB程序设计-1.MATLAB简介
- Masscan:最快的互联网IP端口扫描器
- 2018中原工学院网络安全校赛
- Linux详细安装教程(Centos)
热门文章
- sklearn回归 预测下一期双色球
- 10-142 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格
- 拓嘉辰丰:高价位的商品是否适合拼多多平台
- 视频教程-跨平台APP JQuery Mobile开发-jQuery
- 计算机关闭还漏电什么情况,电脑主机漏电的原因及解决方法
- P1425_小鱼的游泳时间
- 合宙esp32+显示屏测试
- excel找到一列数中最大数的位置
- 如何使用 Google Colab (或其他 python 笔记本)读取谷歌硬盘的文件
- Python爬取重点产业专利信息网(仅供学习交流!!)