看看代码-EventBus

看看代码-EventBus

EventBus是一个非常有名的Android开源项目,能非常方便地对应用内消息进行分发和处理,因近期在看消息通道相关的东西,就看了下代码学习一下,项目地址:EventBus

使用方法

gradle项目中加入dependencies即可使用:

dependencies {
    compile 'org.greenrobot:eventbus:3.1.1'

}

在需要注册的地方使用register方法注册,并给需要接受和处理消息的方法加上Subscribe注解

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
        // 在post方法执行后,onMessageEvent将会收到消息,并且打出对应的Log
        EventBus.getDefault().post(new MessageEvent());
    }

    public interface IMessageEvent{
        void print();
    }

    public abstract static class AbstractMessageEvent {

    }

    public static class MessageEvent extends AbstractMessageEvent implements IMessageEvent{
        @Override
        public void print() {
            Log.d("onMessageEvent","Received.");
        }
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
        event.print();
    }
}

架构概览

image.png

原理分析

EventBus主要使用了观察者模式进行系统的设计。在EventBus中,我们把观察者对象称为订阅者Subscriber,前面的例子中,MainActivity就是一个Subscriber

onMessageEvent则是一个SubscribeMethod

查看EventBus的源码,在EventBus.class中有几个比较重要的变量

eventTypesChahe : 存储Event.class相关的类,包括Event类的父类、以及其实现的接口类

subscriptionsByEventType : 消息-该消息的订阅 的Map,根据发送的消息类型,可以获取到所有的Subscription(一个Subscription由一个Subscriber和一个SubscribeMethod组成) 。

typesBySubscriber:消息-订阅该消息的订阅者类型列表Class(订阅者的对象类型)的Map,根据指定的消息类型,可以找到所有的订阅者类型

register过程

重点方法在register跟subscribe中,主要流程:

EventBust.getDefault().register(Subscriber)

r

  1. 找到Subscriber中所有需要接收消息的方法(SubscriberMethod),以及这些方法接受的消息种类。 这一个步在SubscriberMethodFinder中完成
  2. 将订阅者和订阅方法封装成订阅(SUbscription)并存储在subscriptionsByEventType中
  3. 将消息类型和订阅者类型进行关联,存储在typesBySubscriber

post过程

在subscriptionsByEventType中找到Subscription并取出Subscriber和SubscribMethod,根据设置线程模式的不同,使用不同的Poster,在对应的线程中对订阅方法进行反射调用,实现消息接收和处理

总结

EventBus通过对订阅者和发布者的解耦,简化了消息发送和注册的流程,且消息主体可以为任意类的对象,使得消息虽然在EventBus中进行统一的分发和管理,但并不需要在同一地方集中注册和索引。

EventBus的代码量不多,算是一个比较轻量的框架,暂不支持跨进程的消息传递,且由于EventBus中维护的Subscriber引用都是强引用,没有及时unregister的话,可能会导致内存泄漏。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏肖蕾的博客

关于AndroidStudio混淆打包 proguard-rules.pro 的配置关于AndroidStudio混淆打包 proguard-rules.pro 的配置

1522
来自专栏刘望舒

Android中多线程切换的几种方法

我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。 我们先回顾一下Java...

1604
来自专栏比原链

Derek解读Bytom源码-P2P网络 地址簿

Gitee地址:https://gitee.com/BytomBlockchain/bytom

771
来自专栏ACM小冰成长之路

ZOJ-3329-One Person Game

ACM模版 描述 ? ? 题解 kuangbin 大佬的题解,神乎其技: ? 代码 #include <iostream> #include <cstdio> ...

19510
来自专栏Kubernetes

原 荐 深度解析Kubernetes Pod

Author: xidianwangtao@gmail.com PDB的应用场景 大概在Kubernetes 1.4新增了PodDisruptionBudge...

1K13
来自专栏小樱的经验随笔

【批处理学习笔记】第十四课:常用DOS命令(4)

系统管理 at 安排在特定日期和时间运行命令和程序 shutdown立即或定时关机或重启 taskkill结束进程(WinXPHome版中无该命令) taskl...

2433
来自专栏Android先生

RxJava2 实战知识梳理(3) - 优化搜索联想功能

几乎每个应用程序都提供了搜索功能,某些应用还提供了搜索联想。对于一个搜索联想功能,最基本的实现流程为:客户端通过EditText的addTextChan...

691
来自专栏Google Dart

Flutter 构建完整应用手册-联网 顶

从大多数应用程序获取互联网上的数据是必要的。 幸运的是,Dart和Flutter为这类工作提供了工具!

1012
来自专栏比原链

Derek解读Bytom源码-P2P网络 地址簿

Gitee地址:https://gitee.com/BytomBlockchain/bytom

1073
来自专栏拭心的安卓进阶之路

Android 框架学习1:EventBus 3.0 的特点与如何使用

前面总结了几篇基础,在这过程中看着别人分享自定义 View、架构或者源码分析,看起来比我写的“高大上”多了,内心也有点小波动。 但是自己的水平自己清楚,基础不扎...

2897

扫码关注云+社区