Android EventBus笔记
来源:互联网 发布:windows 2000下载 编辑:程序博客网 时间:2024/06/01 09:59
1:什么是EventBus?我们先来看看官方的定义:EventBus是Android和Java的发布/订阅事件总线。
官方的定义已经介绍得非常清楚了,EventBus就是基于观察者模式实现事件或数据的传递,用于简化程序组件通讯、线程通讯等。既然是基于观察者模式,那么肯定有观察者和被观察者了,观察者就是接受事件数据的方法,这个方法可以在任意页面任意线程。比如我下面准备举的列子是:要从ActivityOne传递数据到ActivityTwo中,那么我们的观察者方法就是在ActivityTwo的,首先在gradle降EventBus添加到项目中:
compile 'org.greenrobot:eventbus:3.1.1'
如果需要添加最新版本,可到GitHub查看,后面给出地址。
然后添加观察者的代码,观察方法如下:
// 该方法在消息发布时调用@Subscribe(threadMode = ThreadMode.MAIN)public void onMessageEvent(MessageEvent event) { Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();}
Subscribe是EventBus3之后引入的annotation,只要加了这个注解,编译的时候,就会生成相应的代码调用这个方法,(threadMode = ThreadMode.MAIN)指定观察者的线程,这里指定了UI线程。上面还有一个类MessageEvent,使用时需要自己定义,定义方式如下:
public class MessageEvent { //这里定义了一个字符串,说明我们事件只传递一个字符串消息,<br/> //也可以定义其它类型的对象,如:List对象 public final String message; public MessageEvent(String message) { this.message = message; }}
这里没什么需要说明的,还有我们需要在ActivityTwo中注册事件,一般建议在onStart方法注册,然后在Onstop方法中释放,代码如下:
@Overridepublic void onStart() { super.onStart(); EventBus.getDefault().register(this);//注册}@Overridepublic void onStop() { EventBus.getDefault().unregister(this);//取消注册 super.onStop();}
最后看看发布事件的代码:
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));//MessageEvent
MessageEvent就是我们前面定义的MessageEvent,给他的构造方法传入相应的数据即可。
到这里EventBus基本使用,就写完了,接下来看看一下线程配置。
刚才在定义onMessageEvent这个方法的时候,有一句@Subscribe(threadMode = ThreadMode.MAIN),@Subscribe是注解生成对象回调,这个不用解释了,然后说一下括号里面的(threadMode = ThreadMode.MAIN)这里指定了onMessageEvent运行在什么线程,因为事件不一定是在主线程发布,所以这个就是线程间通信了,我刚才指定的是主线程,不管事件在什么线程发布,这个方法都会在主线程运行。还有几个线程的配置如下
ThreadMode.POSTING:这个代表在什么线程发布事件,这个观察者方法就在哪个线程运行。
ThreadMode.BACKGROUND:如果调用post方法的线程不是主线程,则直接在该线程执行,如果是主线程,则切换到后台单例线程,多个方法公用同个后台线程,按顺序执行,避免耗时操作。
ThreadMode.ASYNC开辟新独立线程,用来执行耗时操作,例如网络访问
EventBus内部使用了线程池,但是要尽量避免大量长时间运行的异步线程,限制并发线程数量,可以通过EventBusBuilder修改,默认使用Executors.newCachedThreadPool(),后面探讨这个配置。到这里基本使用写完了,后面是一些比较少用的配置,如果有兴趣可以继续往下读。
Configuration(配置)
EventBus Builder类配置EventBus的各个方面。例如,这里是如何构建一个EventBus,它在没有订阅者的情况下保存安静,不发送消息。
EventBus eventBus = EventBus.builder() .logNoSubscriberMessages(false) .sendNoSubscriberEvent(false) .build();
还有一个是当订阅者发生异常的时候,可以会发送一个可以不处理的异常。
EventBus eventBus = EventBus.builder().throwSubscriberException(true).build();
EventBusBuilder 还可以通过里面的installDefaultEventBus()这个方法配置默认实列。使用代码如下:
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();
这里配置的是:当我们在开发的时候,抛异常就会发生崩溃;但是正是发布的版本,抛出这个异常不做处理。
注意:这里必须在第一次调用getDefault()之前配置,而且只能配置一次,所以建议在Application里面使用。
还有一个比较实用的Sticky Events,先描述一下场景,拿刚才那个列子来说:如果ActivityTwo还没有注册的时候,ActivityOne的事件已经触发了,那么用刚才的方法,再打开ActivityTwo,是收不到消息的,EventBus有其它方法解决这个问题,先看看发送事件的方法:
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
这里只是把post换成了postSticky方法,这个方法可以将最新的消息保存起来,然后打开ActivityTwo的时候,再传给监听器。那么相应ActivityTwo的注解也要改成如下:
//这里选择了在UI线程回调 @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event){ Log.i("MyActivity" , event.message); textview.setText(event.message); } @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); }
这样就可以做到保存最新的消息,等注册了,再发送。
然后EventBus还提供了事件优先级别的设置,使用方式如下:
@Subscribe(priority = 1);public void onMessageEvent(MessageEvent event) { Log.i("MyActivity" , event.message);}
priority的值越大,级别越高,注意:线程不影响优先级。
当同一条信息,被多个Activity监听的时候,如果我们只想让一个Activity收到消息就不让其它Activity收到,可以使用如下方法取消:
@Subscribepublic void onMessageEvent(MessageEvent event) {//防止发送给其它订阅者EventBus.getDefault().cancelEventDelivery(event) ;}
然后看看添加Kotlin的支持
apply plugin: 'kotlin-kapt' // ensure kapt plugin is applieddependencies { compile 'org.greenrobot:eventbus:3.1.1' kapt 'org.greenrobot:eventbus-annotation-processor:3.1.1'}kapt { arguments { arg('eventBusIndex', 'com.example.myapp.MyEventBusIndex') }}
混淆规则
-keepattributes *Annotation*-keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <methods>;}-keep enum org.greenrobot.eventbus.ThreadMode { *; }# Only required if you use AsyncExecutor-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable);}
EventBus还有很多有趣的api,比如index索引加速,后面继续探讨。
官网:http://greenrobot.org/eventbus/
GitHub:https://github.com/greenrobot/EventBus
- Android EventBus学习笔记
- Android EventBus笔记
- EventBus 笔记
- Android eventBus
- android EventBus
- android-eventbus
- android eventbus
- Android--EventBus
- Android -- EventBus
- android - EventBus
- android eventbus
- android EventBus
- Android EventBus
- Android EventBus
- Android EventBus
- android EventBus
- android EventBus
- Android EventBus
- 算法还是算力?一篇微博引爆深度学习的“鸡生蛋,蛋生鸡”问题
- JNI调用
- vue基础事件\按键修饰符
- 为什么会有session和cookie以及简单使用
- DHCP (DOS)攻击
- Android EventBus笔记
- (python3)1020. 月饼 (25分)
- 集合框架之Map集合详解
- 快速实现MySQL迁移到Redis
- 第十一周项目2
- kungbin专题五 并查集 POJ1984 Navigation Nightmare
- 【C++基础复习01】结构体和链表
- python中列表,元祖,字典,集合区别和使用方法
- MySQL引擎特性GIS-R-TREE