前沿
Eventbus的原理思想就是观察者模式,当被观察者做了某个举动,观察者就会被立即通知,并做出自己的逻辑处理。简单说小偷在伸手要偷东西时,警察就会立即被通知,进行制止,这就是观察者模式,Eventbus就是根据这个原理应运而生的。
官方
官方给出的是在onStart中注册,在onStop中注销注册,但是在下面的例子中在这两方法中注册和注销是不行,所以个人觉得还是在onCreat中注册在onDestroy中注销。
使用
- 添加依赖
compile 'org.greenrobot:eventbus:3.0.0'
- 简单实例
1、创建事件的实体类:
public class MessageEvent {
private String message;
public MessageEvent(String message){
this.message = message;
}
public String getMessage(){
return message;
}
}
2、Activity one
public class MainActivity extends AppCompatActivity {
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册
EventBus.getDefault().register(this);
text = (TextView) findViewById(R.id.tv_text);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
});
}
//监听事件的方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent event) { //注意这里不能用private修饰,否则报错
text.setText(event.getMessage());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this); //Activity销毁注销注册
}
}
Activity two:
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
findViewById(R.id.sendMessageBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//被观察者发送事件
EventBus.getDefault().post(new MessageEvent("发送事件后文本"));
finish();
}
});
}
效果图
订阅方法注解
进一步认识@subscribe注解:
该注解标示了当前的方法为订阅方法,该注解的内部有三个成员变量,分别为:threadMode,sticky,priority。threadMode代表订阅方法运行的线程,sticky代表是否是粘性事件,priority代表优先级。给这三个成员赋不同的值,能使订阅方法有不同的效果。
threadMode是一个枚举类型,有以下几个值:
public enum ThreadMode {
POSTING,
MAIN,
BACKGROUND,
ASYNC
}
POSTING: 表示订阅方法运行在发送事件的线程。
MAIN: 表示订阅方法运行在UI线程,由于UI线程不能阻塞,因此当使用MAIN的时候,订阅方法不应该耗时过长。
BACKGROUND: 表示订阅方法运行在后台线程,如果发送的事件线程不是UI线程,那么就使用该线程;如果发送事件的线程是UI线程,那么新建一个后台线程来调用订阅方法。
ASYNC: 订阅方法与发送事件始终不在同一个线程,即订阅方法始终会使用新的线程来运行。ThreadMode默认是使用POSTING的,如果需要更改设置,可以在添加注解的时候同时为threadMode赋值。
priority 优先级:设置该优先级的目的是,当一个事件有多个订阅者的时候,优先级高的会优先接收到事件。
sticky 粘性事件:关于粘性事件,可以参考Android的广播机制,其中有一个粘性广播,粘性广播的意思是:该广播发送后,会保存在内存中,如果后来有注册的Receiver与之匹配,那么该Receiver便会接收到该广播。那么粘性事件同理,在注册之前便把事件发生出去,等到注册之后便会收到最近发送的粘性事件(必须匹配)。注意:只会接收到最近发送的一次粘性事件,之前的会接受不到。