EventBus是greenrobot的开源项目。
它的特点是:
(1) 支持在不同类型的线程中处理订阅,包括发布所在线程,UI线程、单一后台线程、异步线程
(2) 支持事件优先级定义,支持优先级高的订阅者取消事件继续传递,支持粘性事件,是不是跟系统的有序广播、粘性广播很像啊
(3) 不是基于annotations
(4) 性能更优
(5) 体积小
(6) 支持单例创建或创建多个对象
(7) 支持根据事件类型订阅
(2) 支持事件优先级定义,支持优先级高的订阅者取消事件继续传递,支持粘性事件,是不是跟系统的有序广播、粘性广播很像啊
(3) 不是基于annotations
(4) 性能更优
(5) 体积小
(6) 支持单例创建或创建多个对象
(7) 支持根据事件类型订阅
http://www.slideshare.net/greenrobot/eventbus-for-android-15314813
使用它只需要四个步骤:
1.定义一个事件
可以用方法名:
②activity B中:
③事件类:
这里有两种订阅方式:
使用它只需要四个步骤:
1.定义一个事件
public class MyEvent{};
2.注册订阅者
EventBus.getDefault().register(this);
3.提交事件
EventBus.getDefault().post(event);
4.接收事件
public void onEvent(MyEvent event) {}
下面是例子:
实现广播和回调接口的功能
两个activity之间的事件订阅(需要用sticky),activity B (
Publisher)中点击发布事件(
Event),activity A (
Subscriber)中订阅事件:
①activity A中:可以用方法名:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
EventBus.getDefault().register(this, "messageFromSecondActivity",
ActivityEvent.class);//订阅事件
}
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
public void messageFromSecondActivity(SecondActivityEvent event) {
textView.setText(event.getText());
}
也可以直接用默认方法onEvent(),方法名不对会报错:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
EventBus.getDefault().register(this);//订阅事件
}
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
public void onEvent(SecondActivityEvent event) {
textView.setText(event.getText());
}
②activity B中:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
EventBus.getDefault().post(new ActivityEvent("ok"));//发布事件
break;
}
}
③事件类:
public classActivityEvent {
private String text;
public ActivityEvent(String text)
{
this.text=text;
}
public String getText(){
return text;
}
}
这里有两种订阅方式:
1. 使用普通的post()和register()方法,
由于在onDestroy()方法会调用unregister()方法,因此如果activity被销毁,请求将失效。
2.使用
postSticky()和registerSticky()方法:
postSticky会缓存最新的event事件,不管接收方是否消亡,载入时都会检测最新状态 ,因此在activity会被销毁的时候需要使用sticky。
ThreadMode共有四类,只需要在onEvent后面加上以下四种模式即可(onEventXXX):
PostThread
:默认的 ThreadMode,表示在执行 Post 操作的线程直接调用订阅者的事件响应方法,不论该线程是否为主线程(UI线程)。当该线程为主线程时,响应方法中不能有耗时操作,否则有卡主线程的风险。适用场景:对于是否在主线程执行无要求,但若 Post 线程为主线程,不能耗时的操作;MainThread
:在主线程中执行响应方法。如果发布线程就是主线程,则直接调用订阅者的事件响应方法,否则通过主线程的 Handler 发送消息在主线程中处理——调用订阅者的事件响应函数。显然,MainThread
类的方法也不能有耗时操作,以避免卡主线程。适用场景:必须在主线程执行的操作;BackgroundThread
:在后台线程中执行响应方法。如果发布线程不是主线程,则直接调用订阅者的事件响应函数,否则启动唯一的后台线程去处理。由于后台线程是唯一的,当事件超过一个的时候,它们会被放在队列中依次执行,因此该类响应方法虽然没有PostThread
类和MainThread
类方法对性能敏感,但最好不要有重度耗时的操作或太频繁的轻度耗时操作,以造成其他操作等待。适用场景:操作轻微耗时且不会过于频繁,即一般的耗时操作都可以放在这里;Async
:不论发布线程是否为主线程,都使用一个空闲线程来处理。和BackgroundThread
不同的是,Async
类的所有线程是相互独立的,因此不会出现卡线程的问题。适用场景:长耗时操作,例如网络访问。