博客
关于我
EventBus
阅读量:486 次
发布时间:2019-03-07

本文共 1702 字,大约阅读时间需要 5 分钟。

Android应用程序中一个非常有用的组件是EventBus,它是一种事件发布-订阅总线。EventBus 由GreenRobot开发,广泛应用于简化组件间的通信问题,特别是在Android项目中处理Fragment组件间的通信时具有显著优势。

EventBus的作用

EventBus的主要作用是提供一种轻松的事件管理方式,简化了应用程序内不同组件间的通信。通过这个总线,开发人员可以在不直接耦合的情况下,轻松地在不同的组件之间传递数据。此外,EventBus能够有效地处理序列化问题,避免了传统广播通信引起的一系列问题。

Element的三要素

在使用EventBus时,事件的处理过程可以分为以下几个部分:

  • Event事件

    事件可以是任何类型的Java对象(POJO),没有特殊要求。它可以包含任意必要的数据字段,用于传递给订阅者。

  • Subscriber事件订阅者

    订阅者需要定义事件处理方法( subscription methods),当发布对应类型的事件时,相应的方法会被调用。在EventBus 3.0之后,订阅者方法需要加注解@Subscribe,并指定线程模式,默认值为POSTING

  • Publisher事件发布者

    事件发布者需要一个EventBus对象,在发布事件时调用post方法。EventBus.getDefault()可以获取默认的总线对象。因此,在任何线程中都可以发布事件。

  • 五种线程模式

    EventBus 提供了五种线程模型,可根据具体需求选择合适的模式:

  • POSTING

    默认模式,事件处理在线程发布事件的地方完成。订阅者方法直接在发布线程中执行,传递事件的开销最小。该模式适用于能够在短时间内完成的任务,不会阻塞发布线程。

  • MAIN

    在Android上,事件处理将在主线程(UI线程)进行。如果发布线程是主线程,订阅者方法会直接在该线程上执行,否则事件会被排队等待传送。此模式下,订阅者方法必须快速返回,否则会导致ANR(应用程序不响应)。

  • MAIN_ORDERED

    事件处理仍在主线程进行,但事件传递是有序的。所有订阅者方法将按顺序执行。这对于需要确保事件传递顺序的情况非常有用。

  • BACKGROUND

    事件处理在背景线程进行,且不能包含UI操作。发布线程是否为主线程会影响事件处理的具体方式。

  • ASYNC

    事件处理在独立的子线程中进行,订阅者方法将在单独的线程上执行。这种模式适用于较长时间的任务,如网络访问,避免了在主线程中产生大量并发任务。

  • EventBus的用法

  • 添加依赖

    在项目中添加EventBus的依赖库。推荐使用版本3.1.1。

  • 定义事件

    事件类可以是任意Java对象,不需要特殊要求。例如,定义一个MessageEvent类,包含必要的数据字段。

  • 订阅事件

    定义订阅者方法,并添加@Subscribe注解。方法名可以任意,参数类型为订阅事件的类型。在Android项目中,通常在onEvent方法上使用@Subscribe(threadMode = ThreadMode.MAIN)注解。

  • 发布事件

    在需要的地方调用EventBus.getDefault().post()方法发布事件。所有订阅了该事件类型且已注册的订阅者将收到该事件。

  • 注销订阅

    在Activity或Fragment的onStartonStop生命周期方法中注册和注销订阅。确保在不需要时及时注销,以减少内存泄漏风险。

  • 黏性事件

    EventBus还支持黏性事件(sticky events),类似于Android中的粘性广播。黏性事件在发送后仍然存在,同时可以被后续的订阅者接收。对于需要长时间存储事件的情况,黏性事件非常有用。

  • 发布黏性事件

    使用postSticky()方法发布黏性事件。

  • 订阅黏性事件

    在订阅者方法中添加sticky = true标志,表示该事件是黏性事件。

  • 移除黏性事件

    使用removeStickyEvent()方法手动移除黏性事件。

  • 参考资源

    • 《Android进阶之光》中有深入的讲解。
    • 关于EventBus的使用,可以参考多个开发者博客和示例代码。

    转载地址:http://vlvcz.baihongyu.com/

    你可能感兴趣的文章
    泛知识类视频会改变短视频行业格局吗?
    查看>>
    小程序触底加载 Invalid attempt to spread non-iterable instance
    查看>>
    IP-Guard回收客户端加密授权,已经加密的文档如何解密
    查看>>
    IP-GUARD支持的数据库版本
    查看>>
    IP-Guard文档权限管理,让核心数据使用更安全
    查看>>
    ip-guard加密在OFFICE文档里插入图片提示错误
    查看>>
    a*算法伪代码及实现
    查看>>
    第十一节 IO编程
    查看>>
    十八、flask之g对象
    查看>>
    GIT学习笔记
    查看>>
    Linux系统调用过程
    查看>>
    stm32 uv5打开uv4工程错误
    查看>>
    mysql怎么终止一个事务_MySql 中游标,事务,终止存储过程方法总结
    查看>>
    SmartRefreshLayout 上拉加载下拉刷新
    查看>>
    app:processDevDebugResources
    查看>>
    最基础的urllib.request.urlopen()基本使用
    查看>>
    C# 异常
    查看>>
    vs 设置静态库输出路径
    查看>>
    strlen sizeof 快
    查看>>
    c++模板定义malloc
    查看>>