概念

深入学习EventBus框架,就必须理解EventBus的相关原理和一些概念;

Subscribe

在EventBus框架中,消息的处理接收方法必须要“@Subscribe”注解来进行标注;

public @interface Subscribe {
ThreadMode threadMode() default ThreadMode.POSTING;
boolean sticky() default false;
int priority() default 0;
}

从Subscribe源码中可以看出,有三个相关的实现,其中sticky 是来标注是否是粘性事件,默认是false,priority 是权重,priority 值越大级别越高,是来EventBus框架内部进行排序用的字段,最重要的ThreadMode 是指消息处理方法运行在哪个线程中;ThreadMode是个枚举类型:POSTING,MAIN,BACKGROUND,ASYNC;

ThreadMode.POSTING:默认值,消息处理方法被调用时所在的线程中执行,避免了线程间的切换,性能开销也最小;

ThreadMode.MAIN:消息处理方法必须在主线程也就是UI线程中执行;

ThreadMode.BACKGROUND:消息处理方法在后台线程中执行;

ThreadMode.ASYNC:开辟一个新的线程,用来执行比较耗时的操作,比如网络访问,数据库访问;

SubscriberMethod

SubscriberMethod类是EventBus3.0框架内部存储消息处理方法相关信息的类;

public class SubscriberMethod {
final Method method;
final ThreadMode threadMode;
final Class<?> eventType;
final int priority;
final boolean sticky;
String methodString;
}

 SubscriberMethod类中的各个字段都是用来对消息处理方法的描述;

method:消息处理方法中方法描述,通过Method类我们可以看出其实在EventBus3.0框架内部使用反射机制;

threadMode:对应的就是消息处理方法中的注解“Subscribe”中的ThreadMode 枚举;

eventType:对应的就是消息处理方法中的参数类型,也就是我们定义的消息处理类;

priority:对应的就是消息处理方法中的注解“Subscribe”中的priority 枚举;

sticky :对应的就是消息处理方法中的注解“Subscribe”中的sticky 枚举;

其实在EventBus3.0框架内部,当注册/订阅一个事件时,框架内部会将消息处理方法转换为SubscriberMethod类,存储在框架的内部;

SubscriberInfo

SubscriberInfo 在EventBus3.0框架内部是一个接口,该接口的目的就是获取订阅类中的SubscriberMethod类的相关信息;

public interface SubscriberInfo {
Class<?> getSubscriberClass();//获取订阅类的类型 SubscriberMethod[] getSubscriberMethods();//获取SubscriberMethod类的集合 SubscriberInfo getSuperSubscriberInfo(); boolean shouldCheckSuperclass();//是否检测基类
}

Subscription

Subscription类存储的就是订阅者与消息处理方法的类,该类很简单,就3个字段,一个存储的是订阅者的实体类,一个是存储的消息处理方法的SubscriberMethod;
final class Subscription {
final Object subscriber;
final SubscriberMethod subscriberMethod;
volatile boolean active; Subscription(Object subscriber, SubscriberMethod subscriberMethod) {
this.subscriber = subscriber;
this.subscriberMethod = subscriberMethod;
active = true;
}
}

  

由浅入深了解EventBus:(二)的更多相关文章

  1. EventBus 二

    前一篇简单演示了EventBus的onEventMainThread()函数的接收,其实EventBus还有另外有个不同的函数,他们分别是: 1.onEvent2.onEventMainThread3 ...

  2. EventBus (二) 使用详解——EventBus使用进阶

    相关文章: 1.<EventBus使用详解(一)——初步使用EventBus> 2.<EventBus使用详解(二)——EventBus使用进阶> 一.概述 前一篇给大家装简单 ...

  3. 由浅入深了解EventBus:(六)

    线程模型 在EventBus3.0框架中执行线程的快速切换,通过ThreadMode来指定线程在哪个线程中执行; 在EventBus3.0框架线程模型有个PendingPost 类负责数据的传递; f ...

  4. 由浅入深了解EventBus:(五)

    事件分发 EventBus3.0的事件的分发时通过EventBus类中的post(粘性事件为postSticky)方法,post与postSticky的唯一区别就是,在postSticky内部首先会向 ...

  5. 由浅入深了解EventBus:(四)

    事件注册 在EventBus3.0框架中订阅者对事件进行注册/订阅是通过EventBus类中的register方法来实现的,register的方法参数就是我们的订阅者的实例; public void ...

  6. 由浅入深了解EventBus:(三)

    原理 EventBus的核心工作机制如下图 在EventBus3.0架构图: EventBus类 在EventBus3.0框架的内部,核心类就是EventBus,订阅者的注册/订阅,解除注册,以及事件 ...

  7. 由浅入深了解EventBus:(一)

    概述 由greenrobot织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架; EventBus是一个消息总线,以观察者模式实现,用于简化程序的组件.线程通信,可以 ...

  8. mysql由浅入深探究(二)----mysql用户操作

    上一节我们完成了mysql的安装,现在我们将开启实战模式,完成一些基本的mysql操作.这节我们分为一些几个内容: mysql中用户新建 mysql中用户删除 mysql中用户修改 mysql中用户查 ...

  9. 【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~

    一.写在前面 还在为时间接收而烦恼吗?还在为各种组件间的消息传递烦恼吗?EventBus 3.0,专注于android的发布.订阅事件总线,让各组件间的消息传递更简单!完美替代Intent,Handl ...

随机推荐

  1. 深拷贝与浅拷贝js,方法

    在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生. 参考 ...

  2. HDU - 5592 ZYB's Premutation (权值线段树)

    题意:给出序列前k项中的逆序对数,构造出这个序列. 分析:使用权值线段树来确定序列元素. 逆序对的数量肯定是递增的,从最后一个元素开始逆向统计,则\(a[i] - a[i-1]\)即位置i之前比位置i ...

  3. ElasticSearch recovery过程源码分析

    [ES版本] 5.5.0 [分析过程] 找到Recovery有6种状态 public class RecoveryState implements ToXContent, Streamable { p ...

  4. 【web Api性能提升技巧】(2)从DataReader手工创建Json字符串

    这个思路是从 一篇文章,关于<提升web api的性能>上看到的.自己实践了一番,写下步骤. 传统的DataReader是遵循这样的一个步骤: While(reader.Read()) { ...

  5. 验证APNS证书的有效性

    openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert xxx.pem

  6. 查看ubuntu 各系统的内核版本

    1.查看ubuntu版本号:   cat  /etc/issue 返回结果: Ubuntu 16.04.2 LTS \n \l   2.查看内核版本号:   cat /proc/version 返回结 ...

  7. 20145321 《Java程序设计》第5周学习总结

    20145321 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 1.Try.catch:Java中所有错误都会被打包为对象,通过try和catch语法可以对代表错误的对象做 ...

  8. oppo R9 WLAN使用代理图解

    以上拼图便是oppo R9 WLAN使用代理图解,代理设为 '手动' ,主机名便是我的电脑的ip地址,端口号是9973: + 9973端口号 (微信web开发者工具不可更改): + 8888 端口号 ...

  9. 关于js中对事件绑定与普通事件的理解

    普通事件指的是可以用来注册的事件: 事件绑定是指把事件注册到具体的元素之上. 通俗点说: 普通事件:给html元素添加一个特定的属性(如:onclick): 事件绑定:js代码中通过标记(id  ta ...

  10. 设置CentOS7虚拟机使用静态IP上网

    一.在VMware里,依次点击”编辑“ - ”虚拟网络编辑器“,如下图,我选择的是NAT模式: 为了能够使用静态IP,这里不要勾选”使用本地DHCP服务将IP分配给虚拟机“这个选项.然后是配置子网ip ...