EventBus轻松使用

 什么是EventBus

  由greenrobot组织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架,功能:通过解耦发布者和订阅者简化Android事件传递,EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)。

如何使用

  首先gradle中引入

compile 'org.greenrobot:eventbus:3.0.0'

  EventBus常用的有三个函数

  1.注册事件,注册过的类能够接受EventBus发出的消息事件.

EventBus.getDefault().register(this);

  2.取消注册

EventBus.getDefault().unregister(this);

  3.发出消息,在任意一个活动或服务中调用该方法传递数据,所有注册过事件的类都能收到消息,参数为object类型,在事件处理函数中强制转换

EventBus.getDefault().post("你好");

  4.事件处理函数,在注册过EventBus的类中用该函数处理post传递的数据。函数名可为任意的,只需用注解声明(仅限于EventBus3.0,3.0开始支持注解,之前的版本函数为固定的几个函数),下面解释threadMode参数

@Subscribe(threadMode = ThreadMode.MAIN)
    public void XXX(String str){
        Log.d("LoginActivity",str);
    }

事件处理函数详解

  1.参数含义,threadMode共有4个参数,标识函数在哪个地方运行,比如主线程或者子线程。

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

  2.事件优先级。在相同的线程模式下,高优先级的订阅者将会比低优先级的订阅者更早接收到事件。EventBus默认的优先级是0,这样高优先级事件处理完时间后可以使用cancelEventDelivery(object),阻断消息的传播。          注意:优先级不会影响不同线程模式下的订阅者接收事件的顺序。

@Subscribe(threadMode = ThreadMode.MAIN,priority = 1)
public void XXX(object o){
  //处理逻辑
  //阻断传递
  cancelEventDelivery(o);
}

粘性事件

  简单的说粘性事件就是在发布粘性消息后,再在某个类中注册EventBus,声明一个粘性事件处理函数任然可以接收到之前发布的粘性事件。

  1.发布事件,注意这里是postSticky

EventBus.getDefault().postSticky("Hello everyone!");

  2.注册Eventbus,和之前一样

EventBus.getDefault().register(this);

  3.处理消息,注意在注解参数中声明:sticky:true,表示该事件能够接受粘性事件

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(String event) {
    Log.d("EventBus",event);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python爬虫日记

Wing ide 6.0 注册 ,python 3.6环境

13150
来自专栏恒思考

一个人的app后端-parse的安装与使用

mkdir -p ~/mongo ~/mongo/db cd ./mongo/ docker run -p 27017:27017 -v ~/mongo/db:...

26730
来自专栏圣杰的专栏

事件总线知多少(2)

源码路径:Github-EventBus 事件总线知多少(1) 事件总线知多少(2) 1.引言 之前的一篇文章事件总线知多少(1),介绍了什么是事件总线...

24070
来自专栏开发与安全

80386的分段机制、分页机制和物理地址的形成

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了...

28950
来自专栏JavaEdge

从servlet容器说起1 Servlet容器的启动过程2 Web 应用的初始化工作

364120
来自专栏攻城狮的动态

iOS面试题梳理(三)

39070
来自专栏大内老A

如何在调用WCF服务之前弹出一个确认对话框?

昨天有人在微博上问我如下一个问题: 老蒋,客户端调用wcf的一个接口函数时,有没有什么办法可以先弹出一个确认框,确认后再执行调用。因为这个接口函数再很多地方都...

25890
来自专栏大内老A

ASP.NET MVC集成EntLib实现“自动化”异常处理[实例篇]

个人觉得异常处理对于程序员来说是最为熟悉的同时也是最难掌握的。说它熟悉,因为仅仅就是try/catch/finally而已。说它难以掌握,则是因为很多开发人员却...

219100
来自专栏大内老A

[WCF REST] 通过ASP.NET Output Caching实现声明式缓存

ASP.NET的输出缓存(Output Caching)机制允许我们针对整个Web页面或者页面的某个部分(主要针对用户控件)最终呈现的HTML进行缓存。对于后续...

21170
来自专栏大内老A

[WCF REST] 通过ASP.NET Output Caching实现声明式缓存

ASP.NET的输出缓存(Output Caching)机制允许我们针对整个Web页面或者页面的某个部分(主要针对用户控件)最终呈现的HTML进行缓存。对于后续...

19360

扫码关注云+社区

领取腾讯云代金券