EventBus 项目地址:https://github.com/greenrobot/EventBus#comparison-with-squares-otto
简介
EventBus 是基于推送/订阅模式的事件总线开源项目,使用它可以代替传统的Handler,Intent,广播等实现不同组件之间数据传递。例如Activity之间传递数据,Activity与Fragment之间传递数据。还有一点是对于不同线程的处理是比较特别的,下面你会看到这一点。
官方提供的模型图:
添加到项目里
Gradle:
compile 'org.greenrobot:eventbus:3.0.0'
Maven:
<dependency>
<groupId>org.greenrobot</groupId>
<artifactId>eventbus</artifactId>
<version>3.0.0</version>
</dependency>
或者下载源码导入到工程
使用步骤3步
(1)自定义事件类,用作信息传递的载体。
public class TaskEvent {
private static final String Tag = "TaskEvent";
private TomatoTask tomatoTask;
public TaskEvent(TomatoTask tomatoTask){
this.tomatoTask = tomatoTask;
}
public TomatoTask getTomatoTask(){
return tomatoTask;
}
}
(2)订阅
简单的获取方式,获取共享实例对象之后订阅:
EventBus.getDefault().register(this);
也可以设置订阅的优先级,优先级高的最先接收到事件,默认为0。不同的Thread中优先级没有意义。
int priority = 1;
EventBus.getDefault().register(this, priority);
在订阅的类中添加接收事件的方法:
@Subscribe
onEvent(Event event)
如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
@Subscribe
onEventMainThread(Event event)
如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
@Subscribe
onEventBackground(Event event)
如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
@Subscribe
onEventAsync(Event event)
使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
注意:方法顶部要添加注解@Subscribe,不然会报错。
(3)事件发布
EventBus.getDefault().post(new TaskEvent(tomatoTasks.get(position)));
还有一种是sticky 事件,意思是缓存事件,当事件发布了之后如果有订阅者订阅了该事件就可以接收。区别于上面的先订阅再发布事件。
相应的代码写成:
发布:EventBus.getDefault().postSticky(new TaskEvent(tomatoTasks.get(position)));
订阅:EventBus.getDefault().registerSticky(this);
混淆配置:
-keepclassmembers class ** {
public void onEvent*(**);
}
# Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}