• EventBus中观察者模式的应用


    一 介绍

    EventBus是一款安卓的开源消息传递框架,地址:https://github.com/greenrobot/EventBus

    android系统的消息传递非常复杂,比如activity和activity之间,同一个activity内部其他线程和主线程之间,activity和service之间,activity和broadcastreceiver之间,可用的处理方式有Bundle对象,Handler方式,AnsycTask方式。

    EventBus的目的是统一这些消息处理过程,将消息处理过程抽象为发布者-订阅者模式,发送消息的组件叫做发布者publisher,接受消息的组件叫做订阅者subscriber,消息传递的过程就是发布者发布一个事件,然后订阅者接受。

    这实际上是用的就是观察者模式,订阅者就是观察者,随时准备对发布者发布的信息做出反应。

    上面是EventBus的工作流程,Publisher是发布者,EventBus是一个消息的集合或者说中间件,Subscriber是订阅者,它在一个类里面,是该类的一个子线程,它负责时刻监听发布者Publisher发送的消息,然后对消息做出反应。这是典型的观察者模式。

    二  代码分析

    订阅者是一个实体类,代码在https://github.com/greenrobot/EventBus/blob/master/EventBus/src/org/greenrobot/eventbus/Subscribe.java

    订阅方法的代码在https://github.com/greenrobot/EventBus/blob/master/EventBus/src/org/greenrobot/eventbus/SubscriberMethod.java,如下所示:

    这里定义了发布者发布消息的一些属性,比如消息的优先级priority,是否是粘滞消息sticky(可以先发布消息,稍后注册),线程的模型threaedMode。

    再来看发布者,发布者分为好几种:

    分类的依据是它们发布消息的线程模式。

    来看一下其中HandlerPoster的源代码:

     可以看到,它继承了Handler类,所以明显这个发布者发布消息的过程其实就是调用了安卓系统本来有的handler模式,或者说封装了Handler模式。

    继续看它的代码:

    这里的handlerMessage方法就是用来监听发送给自己的消息,然后进行处理,这是典型的观察者模式的应用

    再来看一下AsyncPoster,这也是一个发布者类,其中有一个方法run:


    在这个方法里面,发布者通过invokeSubscriber通知订阅者,这是观察者模式中的消息通知方式。

    以上就是EventBus中使用观察者模式的全部例子。

  • 相关阅读:
    C++模板编译模型
    C++继承与构造函数、复制控制
    PHP判断用户是手机端?还是浏览器端访问?
    CentOS6.5搭建LNMP
    星级评分--封装成jquery插件
    扩展thinkphp5的redis类方法
    js实现星级评分之方法一
    js原型与继承
    一个基于Tp3.2(thinkphp3.2)的工会管理系统
    实验楼的php比赛题,网页数据提取。
  • 原文地址:https://www.cnblogs.com/brucexiajun/p/9813423.html
Copyright © 2020-2023  润新知