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原理相关推荐

  1. 深度理解Android InstantRun原理以及源码分析

    @Author 莫川 Instant Run官方介绍 简单介绍一下Instant Run,它是Android Studio2.0以后新增的一个运行机制,能够显著减少你第二次及以后的构建和部署时间.简单 ...

  2. 打造简易NineoldAndroids动画库,深入理解Android动画原理

    简介 NineoldAndroids是Github上一个著名的动画库,简单来说,NineOldAndroids是一个向下兼容的动画库,主要是使低于API 11的系统也能够使用View的属性动画. 网上 ...

  3. 理解Android系统的进程间通信原理(二)----RPC机制

    理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...

  4. 理解Android系统的进程间通信原理------RPC机制

    理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...

  5. 《深入理解Android》一2.1 浏览器工作原理概述

    本节书摘来自华章出版社<深入理解Android>一书中的第2章,第2.1节,作者孟德国 王耀龙 周金利 黎欢,更多章节内容可以访问云栖社区"华章计算机"公众号查看 2. ...

  6. android r.java 原理,深入理解Android消息处理系统原理

    Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制.实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制. Android通过Looper.Ha ...

  7. android安装教程!深入理解Flutter动画原理,大厂面试题汇总

    背景 知乎客户端中有一个自己维护的 Hybrid 框架,在此基础上开发了一些 Hybrid 页面,当需要前端或者客户端开发接口的时候,就涉及到联调的问题. 和一般的 前端 <=> 服务端, ...

  8. Android EventBus的实现原理

    EventBus的出现完美的解决了多个线程和多个activity.fragment之间的通信问题,下面我们来讲解一下具体的实现原理: 1.首先通过EventBus.getDefault().regis ...

  9. 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第二章 深入理解Netd

    原文: http://blog.csdn.net/innost/article/details/20400389 本文使用的源码版本为Android5.1 本章主要内容 介绍Netd; 介绍MDNS和 ...

最新文章

  1. Kotlin基本语法和使用
  2. RabbitMQ的五种工作方式详细
  3. 34 多线程同步之Event
  4. 如何自学python基础-零基础小白该如何学习Python?
  5. QuickContact分析及其弹出窗口实现
  6. 接口和抽象类的区别?
  7. Mysql 解决left join 数据重复的问题
  8. php日程 增删改查,使用Fullcalendar管理日程事件(增删改查拖放)
  9. 国内外著名CAD、CAM雕刻软件介绍
  10. sql 导入excel 遇到问题
  11. 非涉密计算机保密自查表,非涉密计算机检查记录表-保密处-20210711022211.pdf-原创力文档...
  12. 战地一自定义服务器怎么搜索,战地1怎么快速加入服务器?多种加入方法一览...
  13. 机器人领域的SCI期刊和会议
  14. 手机safari导入html书签,苹果手机safari书签及其历史记录怎么恢复
  15. Android控制所有播放器的音频切换上下首歌、播放、停止
  16. linux网卡发送优化,Linux 性能分析总结之网络(六)
  17. 员工转正述职答辩问什么问题_员工转正述职报告范文
  18. F5 Networks数据中心资源整合解决方案
  19. linux下flock函数,flock()函数 Unix/Linux
  20. 3.1 数据报表之Excel操作模块 XlsxWriter

热门文章

  1. 解决警告You are running the esm-bundler build of vue-i18n. It is recommended to configure your bundler
  2. 被修改的文件还原到某个时间点
  3. 场景法(流程图法)、错误推测法
  4. html pdf支持css%写法吗,HTML2PDF不支持的字符:打破,所有的CSS(Html2pdf doesn't supp
  5. 计算机实习日记第一天
  6. git push超时小妙招-fatal: unable to access, Failed to connect to github.com port 443: Timed out
  7. 计算机操作系统期末复习大纲
  8. 【Oracle】 sql 中的字符(串)替换与转换
  9. 设置windows10 的默认应用
  10. 前端入门技术书籍推荐:JavaScript高级程序设计等,吐血整理!