功能:通过解耦发布者和订阅者简化Android事件传递
EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。
特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)
使用场景
用于线程间的通讯代替handler或用于组件间的通讯代替Intent
广泛用于团购,商城,社交等应用,比如易大师APP,易宸锋Application…
实践证明已经有一亿多的APP中集成了EventBus
优势编辑
简化了组件间的通讯。
分离了事件的发送者和接受者。
在Activity、Fragment和线程中表现良好。
避免了复杂的和易错的依赖关系和生命周期问题。
使得代码更简洁,性能更好。
更快,更小(约50k的jar包)。
1.下载 eventBus 3.0.jar:DownLoad
2.导入jar eventBus 3.0.jar 到android工程
3.注册
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册eventbus
EventBus.getDefault().register(this);
}
4.在activity onDestroy 调用是反注册
@Override
protected void onDestroy() {
//反注册
EventBus.getDefault().unregister(this);
super.onDestroy();
}
5.定义事件
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
6.订阅者 @Subscribe
@Subscribe(threadMode = ThreadMode.MainThread)
public void onMoonEvent(MessageEvent messageEvent){
Log.i(TAG, Thread.currentThread().getName()+"收到");
Log.i(TAG, messageEvent.getMessage()+"收到");
}
7.发送事件
...
//事件发送
EventBus.getDefault().post(new myMessage("事件"));
...
...
ThreadMode
PostThread(默认)[发布事件和接收事件是同一线程]:
该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。任何事件处理情景使用这种模式必须保证能够快速地返回结果,否者可能将引起线程阻塞,当发布事件的线程是主线程时,还可能会出现ANR
MainThread[主线程,UI更新操作]:
不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中执行,任何事件处理使用这种模式必须保证快速地返回结果,从而避免阻塞主线程,该方法可以用来更新UI,但是不能处理耗时操作。
BackgroundThread [后台线程,不允许进行UI更新操作]:
当发布事件的线程不是主线程时,事件处理方法将会立即在该线程中被调用;如果发布时间的线程是主线程,EventBus会使用一个单例的后台线程调用事件处理函数,该后台线程将会按照时间顺序处理并交付所有的事件,任何事件处理场景使用这种模式必须保证快速地返回结果,从而避免阻塞线程。
Async[用于耗时操作]:
事件处理方法将会在异步的线程中被调用。该异步线程既不是主线程,也不是事件发布线程,在该模式下,发布事件不必等待事件处理方法执行完毕。在事件处理方法执行诸如网络请求等需要花费一定时间的任务时,推荐使用该模式。在使用过程中为了限制并发线程的数量,尽量避免在同一时间段内触发过多需要长时间执行的异步处理方法。
黏性事件
1.订阅黏性事件
//sticky=true
@Subscribe(threadMode = ThreadMode.MainThread,sticky=true)
public void onMoonEvent(MessageEvent messageEvent){
Log.i(TAG, Thread.currentThread().getName()+"收到");
Log.i(TAG, messageEvent.getMessage()+"收到");
}
2.推送黏性事件
EventBus.getDefault().postSticky(new myMessage("黏性事件"));
3.注册即可接收黏性事件
Priority 优先级
优先级必须针对同一类型(ThreadMode)的观察者,priority值越大,越先收到事件或消息。