前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >看看代码-EventBus

看看代码-EventBus

原创
作者头像
NaOH
发布2018-06-13 17:08:02
5640
发布2018-06-13 17:08:02
举报
文章被收录于专栏:写写代码吃吃瓜

看看代码-EventBus

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

使用方法

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

代码语言:txt
复制
dependencies {
    compile 'org.greenrobot:eventbus:3.1.1'

}

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

代码语言:txt
复制
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
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的话,可能会导致内存泄漏。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 看看代码-EventBus
    • 使用方法
      • 架构概览
        • 原理分析
          • register过程
          • post过程
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档