代码里面发送粘性事件代码如下:

  1. //  发送Sticky事件
    EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"),
    "soyoungboy");


然后我们进入postSticky方法里面去:
EventType 是什么?
该类是描述一个函数唯一性的对象,参数类型、tag两个条件保证了对象的唯一性.通过该类的对象来查找注册了相应类型和tag的所有订阅者{@see* Subscription}, 并且在接到消息时调用所有订阅者对应的函数. 
mStickyEvents是什么?
  1.  private List<EventType> mStickyEvents = Collections
    .synchronizedList(new LinkedList<EventType>());


是个list集合,用于存储eventType的list集合。
  1.  /**
    * 发布Sticky事件,tag为EventType.DEFAULT_TAG
    *
    * @param event
    */
    public void postSticky(Object event) {
    postSticky(event, EventType.DEFAULT_TAG);
    }
    /**
    * 发布含有tag的Sticky事件
    *
    * @param event 事件
    * @param tag 事件tag
    */
    public void postSticky(Object event, String tag) {
    EventType eventType = new EventType(event.getClass(), tag);
    eventType.event = event;
    mStickyEvents.add(eventType);
    // 处理sticky事件
    // mDispatcher.handleStickyEvent(eventType, null);
    }
这是发布,如何接收粘性事件,我们也看下源码来分析下:
首先要注册粘性事件的eventbus:
  1. EventBus.getDefault().registerSticky(this);
走进registerSticky代码里面看下:
  1.  /**
    * 以sticky的形式注册,则会在注册成功之后迭代所有的sticky事件
    *
    * @param subscriber
    */
    public void registerSticky(Object subscriber) {
    this.register(subscriber);
    // 处理sticky事件
    mDispatcher.dispatchStickyEvents(subscriber);
    }

    register代码不进行分析,因为前面讲过,就是将@ subscriber的订阅者对象放入map集合里面去

重点分析下 mDispatcher.dispatchStickyEvents(subscriber);
  1.  void dispatchStickyEvents(Object subscriber) {
    for (EventType eventType : mStickyEvents) {
    handleStickyEvent(eventType, subscriber);
    }
    }


在往下面走:
根据不同的ThreadMode去调用不同的handler(这里是事件分发器对象)的handleEvent方法。
ThreadMode是在代码里面通过注解传进来的。
/**
* 处理单个Sticky事件
*
* @param eventType
* @param aEvent
*/
private void handleStickyEvent(EventType eventType, Object subscriber) {
//从缓存获取eventTypes内容
List<EventType> eventTypes = getMatchedEventTypes(eventType, eventType.event);
// 事件
Object event = eventType.event;
//循环遍历eventType集合
for (EventType foundEventType : eventTypes) {
Log.e("", "### 找到的类型 : " + foundEventType.paramClass.getSimpleName()
+ ", event class : " + event.getClass().getSimpleName());
//从订阅者的map集合里面获取指定的订阅者集合的list集合,根据eventType
final List<Subscription> subscriptions = mSubcriberMap.get(foundEventType);
if (subscriptions == null) {
continue;
}
//遍历list集合
for (Subscription subItem : subscriptions) {
final ThreadMode mode = subItem.threadMode;
EventHandler eventHandler = getEventHandler(mode);
// 如果订阅者为空,那么该sticky事件分发给所有订阅者.否则只分发给该订阅者
if (isTarget(subItem, subscriber)
&& (subItem.eventType.equals(foundEventType)
|| subItem.eventType.paramClass
.isAssignableFrom(foundEventType.paramClass))) {
// 处理事件
eventHandler.handleEvent(subItem, event);
}
}
}
}
mDispatcher是个事件分发器;
EventDispatcher事件分发器中有三条个ThreadEventHandler:
UIThreadEventHandler
DefaultEventHandler
AsyncEventHandler
都实现了EventHandler事件处理接口,实现handleEvent方法:
UIThreadEventHandler中实现:
事件处理在UI线程,通过Handler将事件处理post到UI线程的消息队列,UIThreadEventHandler的handleEvent指向DefaultEventHandler的handleEvent方法;列  

  1. /**
    * @param subscription
    * @param event
    */
    public void handleEvent(final Subscription subscription, final Object event) {
    mUIHandler.post(new Runnable() {
    @Override
    public void run() {
    mEventHandler.handleEvent(subscription, event);
    }
    });
    }


 
AsyncEventHandler中实现:默认也是子类为DefaultEventHandler的handleEvent去实现,重点还是DefaultEventHandler中的handleEvent的实现。
  1.  /**
    * 将订阅的函数执行在异步线程中
    *
    * @param subscription
    * @param event
    */
    public void handleEvent(final Subscription subscription, final Object event) {
    mDispatcherThread.post(new Runnable() {
    @Override
    public void run() {
    mEventHandler.handleEvent(subscription, event);
    }
    });
    }


DefaultEventHandler中实现:
重点是subscription.targetMethod.invoke(subscription.subscriber.get(), event),代码走到最后走到这里,那么到这这里执行了什么操作呢;
执行反射操作,根据参数查找方法,进行反射调用。
 /**
* handle the event
*
* @param subscription
* @param event
*/
public void handleEvent(Subscription subscription, Object event) {
if (subscription == null
|| subscription.subscriber.get() == null) {
return;
}
try {
// 执行
subscription.targetMethod.invoke(subscription.subscriber.get(), event);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}

【第五篇】androidEventbus源代码阅读和分析之发送粘性事件和接收粘性事件代码分析的更多相关文章

  1. 【第五篇】androidEventbus源代码阅读和分析之unregister代码分析

    代码里面注销eventbus一般我们会在onDestory里面这么写: EventBus.getDefault().unregister(this); 然后走到unregister里面去看看: /** ...

  2. 【第四篇】androidEventbus源代码阅读和分析

    1,分析androidEventbus的注册源代码: 我们在使用androidEventbus的第一步是注册eventbus,如下代码: EventBus.getDefault().register( ...

  3. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  4. tensorflow笔记:多层LSTM代码分析

    tensorflow笔记:多层LSTM代码分析 标签(空格分隔): tensorflow笔记 tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) ten ...

  5. PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()

    PostgreSQL代码分析,查询优化部分. 这里把规范谓词表达式的部分就整理完了,阅读的顺序例如以下: 一.PostgreSQL代码分析,查询优化部分,canonicalize_qual 二.Pos ...

  6. 免费的Lucene 原理与代码分析完整版下载

    Lucene是一个基于Java的高效的全文检索库.那么什么是全文检索,为什么需要全文检索?目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结构的 ...

  7. PostgreSQL代码分析,查询优化部分,canonicalize_qual

    这里把规范谓词表达式的部分就整理完了.阅读的顺序例如以下: 一.PostgreSQL代码分析,查询优化部分,canonicalize_qual 二.PostgreSQL代码分析,查询优化部分,pull ...

  8. tensorflow笔记:多层CNN代码分析

    tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) tensorflow笔记:多层CNN代码分析 (三) tensorflow笔记:多层LSTM代码分析 ...

  9. Linux kernel的中断子系统之(七):GIC代码分析

    返回目录:<ARM-Linux中断系统>. 总结: 原文地址:<linux kernel的中断子系统之(七):GIC代码分析> 参考代码:http://elixir.free- ...

随机推荐

  1. [翻译]Webpack解惑

    本文译自Webpack - The Confusing Parts,原文需FQ. Webpack现在是React应用程序标配的模块打包器,我估计Angular2和其他框架的用户也在大规模使用.我第一次 ...

  2. jquery中这句 .stop(false,true); 什么意思

    .stop 是jQuery中用于控制页面动画效果的方法.运行之后立刻结束当前页面上的动画效果.stop在新版jQuery中添加了2个参数:第一个参数的意思是是否清空动画序列,也就是stop的是当前元素 ...

  3. 微信小程序入门——怎么建多个项目?(导入官方Demo程序进行学习)

    昨天1月9日微信小程序发布,顿时被朋友圈刷爆,今天看了一下官方文档,自己开始一步一步搭建环境体验小程序开发. 常见问题: 1.微信小程序开发是否需要重新创建开发者账号? 需要,即使之前申请了微信服务号 ...

  4. mybatis-generator 代码自动生成工具(maven方式)

    由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易出错,mybatis-gennerator插件帮我们自动生成mybatis所需要的 ...

  5. jq屏蔽f5

    //屏蔽F5 $(document).ready(function () { $(document).bind("keydown", function (e) { e = wind ...

  6. Java入门第三季排序练习

    package imooc_collection_map_demo; import java.util.ArrayList;import java.util.Collections;import ja ...

  7. 将stack翻译成"堆栈"实在是误人子弟

    也不知道从何时起,也不知道是哪个"教授"还是"老师",将stack翻译成堆栈(据说台湾叫做"堆叠").窃以为,这种翻译实在是误人子弟(题外话 ...

  8. Winform DataGridView直接导出Excel

    /// <summary> /// 导出excel /// </summary> /// <param name="fileName">导出文件 ...

  9. Js的Url中传递中文参数乱码的解决

    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: 2. 接收参数页面:test02.html 二:如何获取Url& ...

  10. 浏览器的云加速可能导致IP统计异常

    前段时间弄个流量统计相关的东西,请求展示图片时根据请求的IP进行 md5 签名生成点击链接的验证参数,结果发现一个莫名其妙的问题 发现点击日志中有一小部分点击的IP居然不一致,如果是开放给别人用可能存 ...