1 研发背景

案例:我们在主页点收藏按钮,未登录状态,跳登录界面,在登录界面跳注册页面,注册成功,关闭注册页面,关闭登录页面,回到主页,刷新item列表和登录状态。
我们一般会用到发送广播和接收广播来实现。本地广播是相对消耗时间、空间最多的一种方式,是重量级的,消耗资源较多的一种方式。四大组件之一,许多系统级的事件都是通过广播来通知的。比如网络变化,电量变化,短信发送接收。
如果与系统相关的通知,还是选择本地广播。在广播的onreceive方法中,可以获得context,intent参数,有丰富的api供我们使用。如果与系统事件不相关的交互,使用广播是一种浪费。由此,我们可以使用EventBus来实现相关需求。

2 EventBus简介

EventBus 是一款针对Android优化的发布/订阅事件总线。主要功能是替代intent,handler,broadcast在fragment,activity,service,线程之间的传递消息。
EventBus作为Android开发常用框架,有许多优点:
1 调度灵活,不依赖context。
2 使用简单,代码简洁。
3 松耦合。有效地降低消息发布者和订阅者之间的耦合度。
当想通知其他组件某些事情发生时常常使用观察者模式。EventBus是一个观察者模式的实现,有三个要素:
1 Event 事件:可以是任意类型对象
2 Subscriber 订阅者,接收特定的事件,以约定的onEvent开头的函数,有4种
3 Publisher 事件发布者,用于通知Subscriber有事件发生,可以通过post(object)在任意线程任意位置发送事件
额外一点,订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者。
EventBus架构图:

3 EventBus 3.0使用

project目录build.gradle  添加classpath: classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 
module目录build.gradle 添加plugin:apply plugin:'android-apt';添加依赖: compile 'com.greenrobot:eventbus:3.0.0’
 
(1) 定义事件
     public class AnyEventType{
       }
 
(2) 在要接收消息的页面注册
    EventBus.getDefault().register(this);
 
(3) 接收消息(共有四个函数,选择实现下列任一 一个)
1、onEvent 事件处理和事件发送在相同线程,事件处理时间不应太长,不然影响事件的发送线程。
2、onEventMainThread 事件的处理在UI线程执行。事件处理时间不能太长,以防出现ANR
3、onEventBackgroundThread 事件处理在一个后台线程中执行,时间不能太长
4、onEventAsync 事件处理在单独的线程中执行,主要用于在后台中执行 耗时操作,每个事件会开启一个线程,但最好限制线程的数目。
 
(4) 发送消息
     EventBus.getDefault().post("resiterSuccess");
(5) 解除注册
     EventBus.getDefault().unregister(this);
 
告知观察者事件发生时通过EventBus.post函数实现,这个过程叫做事件的发布,观察者被告知事件发生叫做事件的接收,是通过下面的订阅函数实现的。
onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
 
问题 这4个方法是否会同时触发?选择哪一个触发?
当发过来一个消息的时候,EventBus怎么知道要调哪个函数呢,就看onEvent函数传进去的参数与发送消息的参数类型是否一致,哪个是就调哪个。那如果有两个是呢,那两个都会被调用!!!!
识别EventBus中四个函数中触发哪一个,是通过参数中的类名来决定的。

第三方框架:EventBus的更多相关文章

  1. iOS-常用的第三方框架的介绍

    写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每 ...

  2. FMDB第三方框架

    FMDB是同AFN,SDWebImage同样好用的第三方框架,它以OC的方式封装了SQLite的C语言API,使得开发变得简单方便. 附上github链接https://github.com/ccgu ...

  3. iOS-数据持久化-第三方框架FMDB的使用

    FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了 ...

  4. android第三方框架 xlistview 的使用

    如今上拉刷新,下拉加载更多已经是浩如烟海的app的标配了 最近正好有相关的需要就去学习了一下,还是那句老话凡事都靠自己来 搞实在不是一件好事,费时费力不说可能还是在做无用功,不过自己研究学习 还是很有 ...

  5. iOS “智慧气象”APP中用到的第三方框架汇总

    “智慧气象”是我最近在公司接手的项目,已经完成最新版本的更新并上架,在此分享下其中用到的第三方框架的使用. 应用地址:APP商店搜索“智慧气象” MJRefresh(下拉刷新)业界知名下拉刷新框架就不 ...

  6. iOS 如何通过CocoaPods添加第三方框架

    一  先安装Ruby环境: http://ruby-china.org/wiki/install_ruby_guide 在安装的时候,若是出现: 1.You don't have write perm ...

  7. 2016 - 1 - 23 json转模型 常用的第三方框架

    一: 三个常用的框架 1. Mantle - 所有模型必须继承MTModel 2. JSONModel - 所有模型必须继承JSONModel 3.MJExtension - 不需要继承任何东西. - ...

  8. iOS边练边学--cocoaPods管理第三方框架--命令行方式实现

    更换源 Gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://rubygems.org/)源来查找.安装.升级和写在软件包 gem sources --remove ht ...

  9. swift 异步加载图片(第三方框架ImageLoader)

    import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...

  10. GitHub 里面有大量优秀的第三方框架

    写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每 ...

随机推荐

  1. linux下安装msgpack,yar,phalcon

    安装msgpack扩展 下载:http://pecl.php.net/package/msgpack cd /usr/local tar zxvf msgpack-0.5.5.tgz cd msgpa ...

  2. linux下装python3以及pip3

    1.wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz 2.tar zxvf Python-3.6.0.tgz 3.cd Pyt ...

  3. python学习笔记(5)

    第七章   模式匹配和正则表达式 1.不用正则表达式来查找文本模式 #对于这样的一个文本查找:3个数字,一个短横线,3个数字,4个端横线,然后再是4个数字,如:415-555-4242def isPh ...

  4. Mysql数据库在建表时指定engine等于InnoDB 或MyISAM的意义

    一.ISAM和InnoDB的定义 1. ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数.因此,ISAM执行读取操作的速度很快 ...

  5. maven项目pom.xml报错: Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.7.1 from

    转自:https://blog.csdn.net/wolf1213hao/article/details/53413093

  6. Docker 启动与停止容器

    启动已运行过的容器 docker start 容器名称|容器id 如: docker start mycentos 启动所有运行过的容器(注意:反单引号` `), docker ps -a -q 是查 ...

  7. vue2.0 之 生命周期

     一.vue1.x与vue2.x生命周期的变化区别及含义表(图表摘自网络)   二.vue2.x生命周期图和各阶段具体含义 beforecreated:el 和 data 并未初始化 created: ...

  8. mysql merge引擎分表

    ---------------------创建表一--------------------------------------DROP TABLE a1;CREATE TABLE `a1` ( `id ...

  9. SQL查询优化的步骤

    一.定位慢查询 SQL优化的一般步骤:先查询mysql数据库运行状况,然后定位慢查询,再分析sql的执行过程,然后进行优化 1.使用show status查询数据库的运行状况 //显示数据库运行状态 ...

  10. NTC电阻Rt与温度T关系

    NTC电阻Rt与温度T公式如下: Rt=10000*exp(3950*(1/(273.15+T)-1/(273.15+25))). 例:0摄氏度时,电阻为33620.6037214357 欧姆 Rt= ...