前几天,有个朋友遇到一个面试题,问在一个 android application中,两个activity之间如何通信。除了我们知道的broadcast、Intent、bundle以及android四大存储类型(preference、file、数据库和contentprovider)、继承application类外,还有一种方法,那就是Eventbus。

当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,例如:当某一条件发生时,应用中有几个部件对这个消息感兴趣,那么我们通常采用的就是观察者模式,使用观察者模式有一个弊病就是部件之间的耦合度太高,在这里我将会详细介绍Android中的解耦组建EventBus的使用。

EventBus主要特点:(来自网络)

1)事件订阅函数不是基于注解(Annotation)的,而是基于命名约定的,在Android 4.0之前的版本中,注解解析起来比较慢 , 事件响应函数默认以“onEvent”开始,可以在EventBus中修改这个值,但是不推荐这么干。

2)事件响应有更多的线程选择

EventBus可以向不同的线程中发布事件,在ThreadMode 枚举中定义了4个线程,只需要在事件响应函数名称“onEvent”后面添加对应的线程类型名称,则还事件响应函数就会在对应的线程中执行,比如事件函数“onEventAsync”就会在另外一个异步线程中执行,ThreadMode定义的4个线程类型如下:

PostThread:事件响应函数和事件发布在同一线程中执行。这个是默认值,这样可以避免线程切换。

MainThread:事件响应函数会在Android应用的主线程(大部分情况下都是UI线程)中执行。

BackgroundThread:事件响应函数会在一个后台线程中执行。如果事件发布函数不是在主线程中,则会立即在事件发布线程中执行响应函数。如果事件发布函数在主线程中,EventBus则会在唯一的一个后台线程中按照顺序来执行所有的后台事件响应函数。

上面的3种事件响应函数,应该能够很快的执行完,不然的话会阻塞各自的事件发布。

async:事件响应函数在另外一个异步线程中执行。该线程和发布线程、主线程相互独立。如果事件响应函数需要较长的时间来执行,则应该使用该模式,例如 网络访问等。需要注意的是,由于系统并行的限制,应该避免在同一时间触发大量的异步线程。 EventBus使用一个线程池来提高线程的效率。

3)EventBus支持 Sticky Event

有时候某个事件可能会用到多次,比如在前面介绍Event Bus模型一文的示例中,最新的位置更新信息,可能需要多次用到,真对这种情况,您可以把该事件发布为Sticky Event,然后,当需要查询该信息的时候,可以通过Bus的getStickyEvent(ClasseventType) 函数来查询最新发布的Event对象。

同一类型的事件只保存最新的Event对象。

注册和发布事件的函数分别为 registerSticky(…) 和 postSticky(Object event)

在项目主页上还有和Otto之间性能对比的表格,以及性能测试的源码。

不管是生产者还是订阅者都需要向Bus注册自己:

bus.register(this);

在每个Activity或者Fragment的onResume和onPause函数中都需要调用bus.register(this)和bus.unregister(this)函数比较麻烦,可以通过一个Bus包装类来自动完成注册的工作,然后在类中只需要继承基类,并调用函数getScopedBus().register(…) 来注册需要的对象即可。

EventBus四种类型的回调函数:

a、onEvent   它和ThreadModel中的PostThread对应,这个也是默认的类型,当使用这种类型时,回调函数和发起事件的函数会在同

一个线程中执行

b、onEventMainThread,当使用这种类型时,回调函数会在主线程中执行,这个在Android中非常有用,因为在Android中禁止在子线

程中修改UI

c、onEventBackgroundThread,当使用这种类型时,如果事件发起函数在主线程中执行,那么回调函数另启动一个子线程,如果事件

发起函数在子线程执行,那么回调函数就在这个子线程执行。

d、onEventBusAsync,当使用这种类型时,不管事件发起函数在哪里执行,都会另起一个线程去执行回调。

EventBus的使用方式:

1)定义一个observer,并加入@Subscribe作为消息回调函数

2)将observer注册到EventBus;EventBus.register(this);

3)消息投递:eventBus.post(logTo);

android d-bus,android EventBus的使用相关推荐

  1. android 常用混淆,Android常用的代码混淆整理【原创】

    android里的代码混淆是比不可少的东西,下面就贴一些常用的代码混淆. #指定代码的压缩级别 -optimizationpasses 5 #包明不混合大小写 -dontusemixedcasecla ...

  2. android实现过程,Android:一个完整app开发流程

    一.给出功能文档 二.APP架构选择 可选MVP,MVVM 三.APP目录结构设置 本app基于mvp架构.除了mvp架构的文件. 还包含下面的文件夹: ui (下面根据Activity划分) wid ...

  3. Android开发之Android性能优化记录

    Android 性能优化 Android 中的性能优化在我看来分为以下几个方面:内存优化.布局优化.网络优化.安装包优化: 内存优化: 下一个问题就是: 布局优化: 布局优化的本质就是减少 View ...

  4. android购物车栏,Android怎么实现二级列表购物车功能

    Android怎么实现二级列表购物车功能 发布时间:2021-04-16 12:45:40 来源:亿速云 阅读:61 作者:小新 小编给大家分享一下Android怎么实现二级列表购物车功能,希望大家阅 ...

  5. 【Android学习】Android常用框架

    1,缓存 1)DiskLruCache Java实现基于LRU的磁盘缓存. 2,图片 1)Glide(已使用) ①概念 图片加载.  Glide 支持拉取,解码和展示视频快照,图片,和GIF动画. ② ...

  6. android+wifi+bridge,Android接入说明

    Android接入说明 Android商户APP端前期准备 1.获取到统一SDK aar包.并放入android项目libs文件夹内(拷贝或者覆盖包时,请clean工程和重新build) 2.项目gr ...

  7. Android 面试(Android 篇)

    Android 面试 安卓篇 一.跨进程通信的几种方式 二.多进程应用使用场景 三.Binder 机制 (进程间的通信) 四.说一说 ANR 五.什么是OOM,如何避免解决 六.内存泄露,内存溢出,内 ...

  8. android proc目录,Android系统/proc目录详解

    /proc是一个虚拟文件系统,其下面的文件不是真实存在的,不占用实际存储空间. /proc/cmdline:显示内核启动的命令行. 示例: /proc/cpuinfo:显示系统cpu的信息. 示例: ...

  9. android layout组件,Android UI学习 - Linear Layout, RelativeLayout

    1.一些常用的公共属性介绍 1) layout_width -宽 fill_parent: 宽度和父元素相同,wrap_content: 宽度随本身的内容所调整,或者指定 px值来设置宽 2) lay ...

  10. android:layout_gravity 和 android:gravity 的区别

    gravity 这个英文单词是重心的意思,在这里就表示停靠位置的意思. android:layout_gravity 和 android:gravity 的区别 从名字上可以看到,android:gr ...

最新文章

  1. JVM:类加载机制之类加载器
  2. 12星座的出生年月日性格_12星座男人最爱的女人性格
  3. matlab cy11,matlab解线性回归方程,y=a0+a1*A+a2*B+a3*C+a4*D+a5*E+a6*F; 数据足够,求a0,a
  4. 《PRML.Translation》pdf
  5. 编程的一些小知识点总结
  6. DOS编写脚本常用命令整理
  7. Spark 已死,Storm 已凉,Flink 永远滴神!
  8. 如何在面试中介绍自己的项目经验
  9. 《星际穿越》关于时间与空间的思考
  10. 详解10大Layer1与4大Layer2年度进展与竞争格局 |链捕手
  11. vant4的showtoast非正常显示问题
  12. 如何通过容器搭建稳定可靠的私有网盘(NextCloud)
  13. 内存管理(五)——内存回收
  14. yml格式或者叫做YAML格式数据学习
  15. 011 Rust死灵书之幽灵数据
  16. vue noVNC实现远程桌面连接
  17. docker tag详解
  18. 用TreeView做权限导航的一个例子
  19. 论文阅读——ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks
  20. 重磅!“集成电路”正式成为一级学科!

热门文章

  1. Linux网站服务Apache+php+mysql的安装
  2. linux挂载U盘,及乱码问题解决
  3. 直接进入ORACLE12C插件数据库
  4. poj 1218(经典开关问题,模拟)
  5. [C#(WebForm)] - 利用递归遍历文件夹和文件存入TreeView
  6. python networkx库_python之networkx库小结
  7. python3.5安装pillow_Python3.5在Windows 10上安装Pillow时出错
  8. c语言使用指针改数组逆置,用指针作函数参数,编写函数,将一个整型数组中的元素全部逆置。...
  9. 六、爬虫中重要的解析库xpath和BeautifulSoup
  10. ehcache 手动刷新缓存_【第 21 期】一个架构师的缓存修炼之路