快速开发工具EventBus的学习与使用

前言

关于EventBus的学习教程网络上有很多,百度一下遍地都是,我这边博客主要是介绍一下,在使用网络上一些教程时常遇到的问题。在此总结一下,方便各位看官。
EventBus项目地址:(https://github.com/greenrobot/EventBus)

一些比较好的EventBus学习教程

  1. EventBus使用详解(一)——初步使用EventBus
  2. Android解耦库EventBus的使用和源码分析
  3. Android EventBus源码解析 带你深入理解EventBus

学习EventBus需要注意的几点

EventBus使用详解(一)——初步使用EventBus 这边文章提供有demo源码供下载。这篇文章的源码是用Eclipse写的,可能比较久远的缘故。我用AndroidStudio写了自己的demo。结果出现了很多问题。

  1. 首先EventBus是一种注解框架,这一点要明确(不能学的稀里糊涂)。因此就需要将EventBus所谓的自定义的Event的字段尽量使用public进行修饰。
  2. 如果将Activity或者Fragment作为观察者:在接收消息的界面需要在onCreate或者onStart中注册EventBus,在onDestory中取消EventBus的注册。
  3. 关于被EventBus通过反射获取的方法onEvent或者onEventMainThread等的名称一定不能出错。这些方法需要用public修饰。
  4. 在以上方法的上面添加注解:@Subscribe否则在AndroidStudio中会报异常,不过使用Eclipse编程则不需要这一步。

    EventBus使用步骤

    1. 定义一个事件,这个事件一旦被EventBus分发出去就是代表某一件事情发生了,这个事件就是某个观察者关心的事情(不需要继承任何类)
    2. 定义观察者,然后将观察者注册到EventBus
      EventBus.getDefault().register()
    3. 由EventBus分发事件,告知观察者发生了什么
      EventBus.getDefault().post()
    4. 使用完成后反注册观察者。
      EventBus.getDefault().unregister()

      如果只是想要停留在会使用EventBus的阶段,以上知识足以。


观察者模式

由于EventBus的设计体现了”观察者模式”,在学习之前可以先补习一下:《JAVA与模式》之观察者模式 了解了观察者模式之后,非常有利于对EventBus源码的理解。这里简述一下观察者模式,以便与对EventBus的设计的理解:
观察者模式原理图
观察者模式所涉及的角色有:
1. 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。
2. 具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。这个类似于EventBus的register方法,可从源码中看出,稍后分析。
3. 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。
4. 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。这个类似于观察者所实现的onEvent方法。

四种订阅函数(就是某件事情发生被调用的方法)

  1. onEvent
  2. onEventMainThread
  3. onEventBackground
  4. onEventAsync

这四种订阅函数都是使用onEvent开头的,它们的功能稍有不同,在介绍不同之前先介绍两个概念:
告知观察者事件发生时通过EventBus.post函数实现,这个过程叫做事件的发布,观察者被告知事件发生叫做事件的接收,是通过下面的订阅函数实现的。

onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟,因为消息有可能是在主线程中发布的。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中更新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEvnetBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

源码分析

至于源码分析,请参考上文中推荐的几篇文章。这里贴出来一些我对源码分析的一些补充,方便起见,我做了一幅图,更直观的使大家理解:
EventBus源码分析简要图

一些小细节

  1. 如果接收消息的界面是FirstActivity,而消息来源为SecondActivity。如果您的跳转顺序为FirstActivity→(通过startActivity跳转)SecondActivity→(通过EventBus,post消息,并startActivity跳转)FirstActivity,此时如果将event的内容显示到FirstActivity则FirstActivity的启动模式应为singleTask,如果通过back键返回,则不必如此。至于原因,请复习一下Activity的启动模式。

参考资料:
Android解耦库EventBus的使用和源码分析
查看EventBus的一些异常的处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值