深入理解Android EventBus原理
1.使用
1.定义一个evnet;
public static class MessageEvent
2.准备观察者
声明和注释你的订阅方法,可选地指定线程模式
@Subscribe(threadMode = ThreadMode.MAIN) //比如这个就指定主线程
public void onMessageEvent(MessageEvent event) {/* Do something */};
关于类型的解释介绍请查阅https://www.jianshu.com/p/a448a161674a
注册和反注册在你的使用中,例如在activity中
@Override
public void onCreate() {super.onCreate();EventBus.getDefault().register(this);
}@Override
public void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);
}
3.post你的事件event
EventBus.getDefault().post(new MessageEvent());
4.订阅者接收事件并处理
onEvent(使用onEvent来接收事件,那么接收事件和post事件在同一个线程中执行)
onEventMainThread( 使用onEventMainThread来接收事件,那么不论post事件在哪个线程运行,接收事件永远在UI线程执行)
onEventBackgroundThread(使用onEventBackgroundThread来接收事件,如果post事件在子线程运行,那么接收事件直接在同一个线程
运行,如果post事件在UI线程,那么会启动一个子线程接收事件)
onEventAsync(使用onEventAsync接收事件,无论post事件在哪个线程 (UI或者子线程) 执行,接收事件都会在一个新的子线程执行)
2.源码分析
1.首先看下他的
EventBus.getDefault()
这里看到,他是用到了单例,保证eventbus对象的唯一,在看看他的构造函数
这里面new了几个hashmap,用来存储订阅者的信息,还有几个poster,用来在不同的线程中post事件的。
mainThreadPoster对应的主线程接收事件
backgroundPoster 某个子线程
asyncPoster 也是对应的某个子线程
2.看他的register
一个管理获取,查询订阅者和订阅者method 的对象subscriberMethodFinder,之后通过反射拿到订阅者的修饰符,方法参数等信息,判断了订阅者的方法参数只能是一个参数,并且是public修饰的,不能是static,final修饰的,否则的话抛出异常
获取的
method,反射方法的对象,Threadmode:线程模式对象,eventType事件的类型
取出method 中的eventtype,然后创建一个Subscription对象,用于存放method和订阅者信息的,之后将eventtype和Subscriptions关联起来,之后把Subscription加入到Subscriptions中,为什么Subscriptions和eventtype关联,因为每个订阅者的可能是不同的eventtype类型,
3.在看下post
currentPostingThreadState这个方法获取当前线程的状态,是否是post,是否是主线程等
while (!eventQueue.isEmpty()) {postSingleEvent(eventQueue.remove(0), postingState);}
之后判断队列里是否有信息,不为空的话就获取post
4.在看下unregister
通过订阅者拿到所有的定义subscribedTypes,之后遍历subscribedTypes,拿到eventtype
之后通过eventtype,获取到订阅者集合,拿到他的size,进行遍历,找到这个订阅者,是他的active是false,并且移除。
深入理解Android EventBus原理相关推荐
- 深度理解Android InstantRun原理以及源码分析
@Author 莫川 Instant Run官方介绍 简单介绍一下Instant Run,它是Android Studio2.0以后新增的一个运行机制,能够显著减少你第二次及以后的构建和部署时间.简单 ...
- 打造简易NineoldAndroids动画库,深入理解Android动画原理
简介 NineoldAndroids是Github上一个著名的动画库,简单来说,NineOldAndroids是一个向下兼容的动画库,主要是使低于API 11的系统也能够使用View的属性动画. 网上 ...
- 理解Android系统的进程间通信原理(二)----RPC机制
理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...
- 理解Android系统的进程间通信原理------RPC机制
理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...
- 《深入理解Android》一2.1 浏览器工作原理概述
本节书摘来自华章出版社<深入理解Android>一书中的第2章,第2.1节,作者孟德国 王耀龙 周金利 黎欢,更多章节内容可以访问云栖社区"华章计算机"公众号查看 2. ...
- android r.java 原理,深入理解Android消息处理系统原理
Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制.实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制. Android通过Looper.Ha ...
- android安装教程!深入理解Flutter动画原理,大厂面试题汇总
背景 知乎客户端中有一个自己维护的 Hybrid 框架,在此基础上开发了一些 Hybrid 页面,当需要前端或者客户端开发接口的时候,就涉及到联调的问题. 和一般的 前端 <=> 服务端, ...
- Android EventBus的实现原理
EventBus的出现完美的解决了多个线程和多个activity.fragment之间的通信问题,下面我们来讲解一下具体的实现原理: 1.首先通过EventBus.getDefault().regis ...
- 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第二章 深入理解Netd
原文: http://blog.csdn.net/innost/article/details/20400389 本文使用的源码版本为Android5.1 本章主要内容 介绍Netd; 介绍MDNS和 ...
最新文章
- Kotlin基本语法和使用
- RabbitMQ的五种工作方式详细
- 34 多线程同步之Event
- 如何自学python基础-零基础小白该如何学习Python?
- QuickContact分析及其弹出窗口实现
- 接口和抽象类的区别?
- Mysql 解决left join 数据重复的问题
- php日程 增删改查,使用Fullcalendar管理日程事件(增删改查拖放)
- 国内外著名CAD、CAM雕刻软件介绍
- sql 导入excel 遇到问题
- 非涉密计算机保密自查表,非涉密计算机检查记录表-保密处-20210711022211.pdf-原创力文档...
- 战地一自定义服务器怎么搜索,战地1怎么快速加入服务器?多种加入方法一览...
- 机器人领域的SCI期刊和会议
- 手机safari导入html书签,苹果手机safari书签及其历史记录怎么恢复
- Android控制所有播放器的音频切换上下首歌、播放、停止
- linux网卡发送优化,Linux 性能分析总结之网络(六)
- 员工转正述职答辩问什么问题_员工转正述职报告范文
- F5 Networks数据中心资源整合解决方案
- linux下flock函数,flock()函数 Unix/Linux
- 3.1 数据报表之Excel操作模块 XlsxWriter
热门文章
- 解决警告You are running the esm-bundler build of vue-i18n. It is recommended to configure your bundler
- 被修改的文件还原到某个时间点
- 场景法(流程图法)、错误推测法
- html pdf支持css%写法吗,HTML2PDF不支持的字符:打破,所有的CSS(Html2pdf doesn't supp
- 计算机实习日记第一天
- git push超时小妙招-fatal: unable to access, Failed to connect to github.com port 443: Timed out
- 计算机操作系统期末复习大纲
- 【Oracle】 sql 中的字符(串)替换与转换
- 设置windows10 的默认应用
- 前端入门技术书籍推荐:JavaScript高级程序设计等,吐血整理!