近段时间有幸接触EventBus这个不错的Android通信框架,确实在实际开发中方便了不少。以前我们子线程与主线程、Fragment、Service之间的通信需要通过Handler来实现通信,现在我们只需要通过EventBus就可以很方便完成我们的需求。
EventBus源码下载地址:https://github.com/greenrobot/EventBus
EventBus是一款针对Android的publish/subscribe(发布 / 订阅)消息事件总线,它简化了组件之间的通信,使我们的应用程序更加简单、通信更加快捷。我们来看EventBus的消息传递图:
EventBus事件主线由四大部分组成:
举个通俗点的例子,EventBus消息机制就是我们生活中的寄快递,你去快递站点寄快递,你就是事件发送者,你的包裹就是事件,快递站点就是EventBus,接收快递的人就是事件订阅者。快递公司经过装车分类最后把你的快递寄到收件人手里,就类似EventBus最后将事件成功传达。
EventBus中的Subscriber有四种订阅函数。
分析以上四种ThreadMode,我们可以明显发现上面四种类型就是为了解决我们的组件之间通信,举个例子,以往我们开启一个子线程进行download,然后通过Hanlder进行发布消息在UI线程中更新我们的UI组件。、
前戏:
Android Studio用户在对应module的gradle中添加:
compile 'de.greenrobot:eventbus:2.4.0'
Eclipse用户直接将jar包拷贝到libs目录下即可。
1、定义事件,我们前面说过事件可以是任何实体对象,只要它能满足我们的传递数据的需要,同时要保证它的唯一性,不然如果有多个事件发送相同的事件类型,会导致我们接收方错乱,所以一般我们都是自定义一个事件类进行封装处理我们的数据。例如下面:
public static class EventText{
private String text;
public EventText(String text){
this.text = text;
}
public String getText(){
return this.text;
}
}
我们定义一个EventText事件(说白了就是一个类),里面封装了我们的数据。
2、发送事件,事件已经定义完毕,我们就可以进行发送事件,来传递我们的数据。
EventBus.getDefault().post(new EventText(response));
3、事件订阅者页面的初始化工作,在EventBus中要求事件的接受页面需要进行register,同时在页面销毁时进行反注册unregister。
一般,我们在Activity的onCreate()方法中进行注册:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
在onDestroy()方法中进行反注册:
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
4、事件订阅者的进行数据处理,事件携带者我们的数据发送过来,现在我们需要对事件进行处理。前面我们已经说了EventBus中定义了四种ThreadMode的事件处理,所以我们根据我们的需要进行一种接收处理即可。例如:
public void onEvent(EventText eventText){
tv_textTextView.setText(eventText.getText());
}
这就是EventBus的最基本使用步骤,我们先来概括性的总结几个方法:
下面我们就在Android Studio中演示一把怎么使用的。我写了几个实例demo,效果图如下:
在上面的效果图中,我写了三个demo,一个是在activity内部进行数据传递,第二个是从别的activity进行获取数据,第三个是activity向别的页面传递数据。三个demo中分别对应:
我们就挑第一个demo给大家展示,有兴趣的可以下载demo看看。
1、先定义我们的消息事件,用于封装我们传递的数据。
public static class FirstEvent{
private String value;
public FirstEvent(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
2、代码比较简单,我们直接看下全部页面代码。
public class FirstActivity extends Activity {
private Button btn_showDownLoad;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
setContentView(R.layout.activity_first);
btn_showDownLoad = (Button) findViewById(R.id.btn_toast);
btn_showDownLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
EventBus.getDefault().post(new EventBusEvents.FirstEvent("我是从网络下载的文本"));
}
}).start();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
public void onEventMainThread(EventBusEvents.FirstEvent firstEvent){
Toast.makeText(this, firstEvent.getValue(),Toast.LENGTH_SHORT).show();
}
}
我们在onCreate()方法中进行注册EventBus事件,在onDestroy()方法中销毁EventBus事件,然后点击Button按钮进行发送Event事件,同时开启一个子线程模拟,最后定义我们的事件接收函数。简单的逻辑就是这样子,很方便。
通过上面的实例发现,我们传递数据确实方便很多,也不需要使用Intent进行数据的传递,EventBus在一些特殊情况下,确实给我们提供了很大的方便,但是我们也要视情况而定,不然会导致过多的Event事件,也不是很好。
源码下载地址
作者:mr_dsw 欢迎转载,与人分享是进步的源泉!
转载请保留地址:http://blog.csdn.net/mr_dsw