什么是EventBus事件总线
EventBus是一个消息总线,以观察者模式实现,用于简化程序的组件、线程通信,可以轻易切换线程、开辟线程。EventBus3.0跟先前版本的区别在于加入了annotation @Subscribe,取代了以前约定命名的方式。
添加依赖
compile’org.greenrobot:eventbus:3.0.0’
源码:https://github.com/greenrobot/EventBus
基本使用
1.自定义一个事件类
public class MessageEvent {
...
}
2.在需要订阅事件的地方注册事件
EventBus.getDefault().register(this);
3.发送事件
EventBus.getDefault().post(messageEvent);
或
EventBus.getDefault().postSticky(messageEvent);
4.处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent) {
...
}
5.取消事件订阅
EventBus.getDefault().unregister(this);
案例
自定义事件
public class FirstEvent {
private String mMsg;
public FirstEvent(String msg) {
// TODO Auto-generated constructor stub
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
注册和取消订阅
public class MainActivity extends AppCompatActivity {
Button btn;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 订阅
*/
EventBus.getDefault().register(this);
btn = (Button) findViewById(R.id.btn_try);
tv = (TextView)findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(getApplicationContext(),
SecodActivity.class);
startActivity(intent);
}
});
}
/**
* 取消订阅
*/
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
事件发布
public class SecodActivity extends AppCompatActivity{
private Button btn_FirstEvent;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);
btn_FirstEvent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* postSticky粘性发布
*/
EventBus.getDefault().post(new FirstEvent("第一个"));
}
});
}
}
事件处理
/**
* 事件处理
* @param event
*/
@Subscribe(sticky = true,threadMode = ThreadMode.MAIN)
public void onEventMainThread(FirstEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
tv.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
EventBus3.0粘性事件
EventBus.getDefault().postSticky(new MessageEvent("粘性事件"));
ThreadMode线程通信
/**
* 事件处理
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(FirstEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
Log.d("harvic", msg);
tv.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
@Subscribe(threadMode = ThreadMode.MAIN)
1.POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
2.MAIN:
事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。