为了大家让大家更加清楚地理解EventBus并使用,本文采用课程的3W1H思路讲解
WHAT
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息
WHY
传统的传递消息,Activity和Activity传递数据,Activity和fragment传递消息,Fragment和Fragment之前,还有Service和Activity。传递消息都使用Intent,或者接口回调,广播,等方法,使用起来非常麻烦。
发送者和接收者耦合度太高,那么就需要寻求一个解决方案。
首先,EventBus使用非常简便,简单的几个事件处理就能解决所有的消息传递问题。
使得消息发送者和处理者耦合度降低,也就是解耦。具有开销小,代码更优雅的特点,使用更加简便。
WHERE
当需要进行组件间通信的时候,或者一个界面的数据发生变化,其他所有的界面数据随之发生变化的时候,可以看出,使用EventBus是多么的方便和易控制。
HOW
(1).自定义一个事件类,可以是空类,比如:
public class AnyEventType {
public AnyEventType(){}
}
(2).获得事件处理实例
采用EventBus.getInstance()来获取默认的EventBus实例
(3).在要接收消息的地方进行注册
eventBus.register(this);
(4).发消息
eventBus.post(new AnyEventType event);
(5).处理消息
public void onEvent(AnyEventType event) {}
(6).解除注册
eventBus.unregister(this);
用一个案例来实现:
A和B两个Activity界面,从A跳转到B界面,从B界面发送一个事件,A收到事件后Toast打印出事件内容。
1.创建一个Android项目
2.下载EventBus的jar包导入工程
3.新建一个事件类
private String mMsg;
public EventBus(String msg) {
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
4.A界面接收消息注册EventBus,点击按钮跳转B界面
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册EventBus
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(),
SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy(){
super.onDestroy();
EventBus.getDefault().unregister(this);//反注册EventBus
}
//收到消息后处理
public void onEventMainThread(EventBusEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
5.B界面发送消息,调用下面的方法
EventBus.getDefault().post(
new EventBusEvent("Event start"));
实际演示,当在BActivity中点击按钮的时候,就会弹出一个Toast通知。