1、EventBus的作用

  EventBus is a publish/subscribe event bus for Android and Java.

  EventBus可以被用来在各种自定义的监听事件中使用,包括不限于Activity、Fragment、Service等等等等需要进行数据传递的地方,不过应该只局限于app内部。

2、EventBus的原理

  

  EventBus是一个典型的事件分发器,Observer模式。订阅者被集中到EventBus类中,当发布者通过post MessageEvent时,通知到订阅者。

3、EventBus的实现

  

    将订阅者注册到EventBus时,EventBus通过SubscriberMethodFinder反射扫描annotation @Subscribe,将注册者中的通知方法都存储在结构体中并返回给EventBus中的

subscriptionsByEventType结构体,这个结构体根据自定义的消息类型进行map存入,并且将该订阅者所有的自定义消息类型都放入结构体typesBySubscriber中。
    当发布自定义的消息时,EventBus从subscriptionsByEventType结构体中取出对应的消息method,invoke对应方法。

    当移除订阅者时,根据此订阅者检索typesBySubscriber,从subscriptionsByEventType结构体中移除所有该订阅者的方法。

4、EventBus的流程(此图看不清时请下载或者放大查看)

  

5、EventBus的使用

  5.1 定义订阅者需要传递的消息类型;对于不同的功能要定义不同的消息,同一个订阅者可以存在不同的消息类型;

  5.2 在订阅者中使用@Subscribe注解方法,方法一定要是public | (Modifier.ABSTRACT | Modifier.STATIC | BRIDGE | SYNTHETIC);

  5.3 将订阅者注册到EventBus,可以使用EventBus的builder方法或者EventBusBuilder进行EventBus的定制;

  5.4 post方法将自定义消息推送到订阅者;注意,由于在EventBus中使用了ThreadLocal的list,更好的支持多线程操作;而post时选择的最终消息推送线程,则由@Subscribe的注解方法中的参数ThreadMode决定;

  5.5 注意要在不使用时unregister订阅者;

  5.6 具体代码可参考EventBus github页面。 (https://github.com/greenrobot/EventBus)   

  1. Define events:

    public static class MessageEvent { /* Additional fields if needed */ }
  2. Prepare subscribers: Declare and annotate your subscribing method, optionally specify a thread mode:

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {/* Do something */};

    Register and unregister your subscriber. For example on Android, activities and fragments should usually register according to their life cycle:

     @Override
    public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
    } @Override
    public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
    }
  3. Post events:

     EventBus.getDefault().post(new MessageEvent());
    
    that's ok.

EventBus总结(原)的更多相关文章

  1. EventBus使用详解(一)——初步使用EventBus

    一.概述 EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间 ...

  2. EventBus源码解析

    用例 本文主要按照如下例子展开: //1. 新建bus对象,默认仅能在主线程上对消息进行调度 Bus bus = new Bus(); // maybe singleton //2. 新建类A(sub ...

  3. android EventBus详解(二)

    上一节讲了EventBus的使用方法和实现的原理,下面说一下EventBus的Poster只对粘滞事件和invokeSubscriber()方法是怎么发送的. Subscribe流程 我们继续来看Ev ...

  4. Rafy中的EventBus

    EventBus主要是干嘛使的,直接翻译叫事件总线. 是观察者模型的实现,利用它你既可以实现观察者模型的业务场景,还可以基于它的事件驱动机制来实现应用程序内组件之间的解耦与通信. 我们来看看有Even ...

  5. 基于.NetStandard的简易EventBus实现-基础实现

    一.问题背景 最近离职来到了一家新的公司,原先是在乙方工作,这回到了甲方,在这一个月中,发现目前的业务很大一部分是靠轮询实现的,例如:通过轮询判断数据处于B状态了,则轮询到数据后执行某种动作,这个其实 ...

  6. ABP vNext EventBus For RabbitMQ 分布式事件总线使用注意事项_补充官网文档

    [https://docs.abp.io/zh-Hans/abp/latest/Distributed-Event-Bus-RabbitMQ-Integration](ABP vNext官方文档链接) ...

  7. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  8. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

随机推荐

  1. 【抓包工具之Fiddler】中session的请求/响应类型与图标对照表

  2. $Noip$前的小总结哦

    考试失误点与积累 有点不知道该干嘛了,状态有点差,写点东西.(后面可能会加更一点东西?) 常规错误 \(1.\) 数组开小 \(2.\) \(int\)和\(longlong\) \(3.\) 开某题 ...

  3. bzoj2560 串珠子 状压DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2560 题解 大概是这类关于无向图的联通性计数的套路了. 一开始我想的是这样的,考虑容斥,那么就 ...

  4. 15_1.InetAddress

    import java.net.InetAddress; import java.net.UnknownHostException; public class InetAdressTest { pub ...

  5. Ubuntu分区小知识与分区方案

    Most PC operating systems still work with an ancient disk partition scheme that historically makes d ...

  6. 【leetcode】1014. Capacity To Ship Packages Within D Days

    题目如下: A conveyor belt has packages that must be shipped from one port to another within D days. The  ...

  7. android android studio error

    SIMPLE: Error computing //cmake 包含的跨平台头文件或者是源文件路径出错

  8. mybatis源码分析之05一级缓存

    首先需要明白,mybatis的一级缓存就是指SqlSession缓存,Map缓存! 通过前面的源码分析知道mybatis框架默认使用的是DefaultSqlSession,它是由DefaultSqlS ...

  9. c#蜘蛛

    C#写一个采集器 using System; using System.Collections.Generic; using System.Text; using System.Net; using ...

  10. CTF | bugku | 字符?正则?

    做题链接 一个详细讲正则的网址1 一个详细讲正则的网址2 代码如下 <?php highlight_file('2.php'); $key='KEY{********************** ...