zoukankan      html  css  js  c++  java
  • Android EventBus解析

    阿里巴巴Android开发手册:

    【强制】Activity 间的数据通信,对于数据量比较大的,避免使用 Intent + Parcelable的方式,可以考虑 EventBus 等替代方案,以免造成 TransactionTooLargeException。

    基础概念:

    EventBus 是一款在Android平台发布的发布/订阅事件总线,主要用来替代 Intent,Handler,Broadcast 在 Fragment,Activity,Service,线程之间传递消息,简化各组件之间的通讯,优点开销小,代码优雅,能够很好的解耦业务与界面交互,缺点是很容易混淆程序逻辑,而且无法进程间通信。
    EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

    EventBus核心架构

    从上图我们知道,该设计采用的是设计模式中的观察者模式。


    EventBus的使用
    EventBus的使用非常简单,主要有3个元素:
    Event:事件,可以是任意类型的对象。
    Subscriber:事件订阅者,添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING),四种线程模型
    Publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用EventBus的post(Object)方法。

    EventBus的四种ThreadMode(线程模型)
    POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
    MAIN: 事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
    BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
    ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。

    EventBus使用就非常简单了,例子网上一大堆,分为五个步骤:
    1.自定义一个事件类

    public class MessageEvent {
    ...
    }

    2.在需要订阅事件的地方注册事件

    EventBus.getDefault().register(this);

    3.发送事件

    EventBus.getDefault().post(messageEvent);

    4.处理事件

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void XXX(MessageEvent messageEvent) {
    ...
    }

    5.取消事件订阅

    EventBus.getDefault().unregister(this);

    2018年开通了个人微信公众号,后面将持续在公众号上发布技术,管理,职业规划,生活趣事等文章,欢迎关注!

    参考:
    Android事件总线(一)EventBus3.0用法全解析
    http://blog.csdn.net/itachi85/article/details/52205464

    Android进程间通信,换一种 HermesEventBus 的姿势吧!
    https://www.jianshu.com/p/f34c3336296f

  • 相关阅读:
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
  • 原文地址:https://www.cnblogs.com/lijunamneg/p/8492164.html
Copyright © 2011-2022 走看看