## (一).前言:
今天我们的项目继续更新,今天我们主要讲解消息总线EventBus的基本使用方法,后面一篇我们会从源码的角度稍微分析一下实现过程。
FastDev4Android框架项目地址:[https://github.com/jiangqqlmj/FastDev4Android](https://github.com/jiangqqlmj/FastDev4Android)
## (二).简介:
以前我们做组件间的消息分发更新,一般会采用观察者模式,或者接口数据回调的相关方式。但是这样的做法虽然可以解决我们的问题,但是组件之间的耦合比较严重,而且代码也不易阅读和相关维护。为了解决这样的问题我们可以使用消息总线EventBus框架。
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。EventBus开源站点地址:[https://github.com/greenrobot/EventBus](https://github.com/greenrobot/EventBus)。
整个订阅和接受的架构如下图:
![](https://box.kancloud.cn/2016-01-18_569c8eb4112fa.jpg)
EventBus的特点如下:
* 简化组件间的消息通信
* 使得代码更加简洁
* 速度很快
* jar包非常小,不到50K
* 还有一些有点例如线程之间的通信,优先级等
## (三).使用方式
3.1.AndroidStudio进行Gradle配置如下:
~~~
compile 'de.greenrobot:eventbus:2.4.0'
~~~
3.2.事件对象定义
~~~
publicclass MessageEvent { /* Additional fields if needed */ }
~~~
3.3.在接收页面进行注册
~~~
eventBus.register(this);
~~~
3.4.接收消息方法实现
~~~
public voidonEvent(AnyEventType event) {/* Do something */};
~~~
3.5.消息发送
~~~
eventBus.post(event);
~~~
OK上面是官方的使用说明,现在我们来具体使用一个实例来展示一下EventBus的基本使用。
## (四).具体事例
4.1.实现需求:在第一个Activity中有一个按钮和一个TextView,然后点击按钮打开第二个Activity,在第二个Activity中有一个按钮,点击按钮关闭当前第二个Activity,同时消息回调到第一个Activity中,在TextView中进行显示。
![](https://box.kancloud.cn/2016-01-18_569c8eb42aaf9.jpg)
4.2.我们这边需要两个Activity布局
~~~
<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击打开第二个Activity"
android:id="@+id/button_one"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="45dp"
android:text="这边显示消息内容..."
android:id="@+id/textView_one" />
</LinearLayout>
~~~
~~~
<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第二个Activity的按钮"
android:id="@+id/button_two"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="45dp"
android:text="当前为第二个Activity"
android:id="@+id/textView_two" />
</LinearLayout>
~~~
4.3.创建一个事件管理类:TestEventFirst.java
~~~
packagecom.chinaztt.fda.event;
/**
* 当前类注释:EventBus测试 First事件类
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.event
* 作者:江清清 on 15/11/3 14:25
* 邮箱:jiangqqlmj@163.com
* QQ: 781931404
* 公司:江苏中天科技软件技术有限公司
*/
public classTestEventFirst {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public TestEventFirst(String msg){
this.msg=msg;
}
}
~~~
4.4:注册和取消注册
使用EventBus.getDefault().register(this);进行注册
使用EventBus.getDefault().unregister(this);进行取消注册
4.5.消息发送
使用 EventBus.getDefault().post(new TestEventFirst("我是第二个Activity回传的信息...."));进行消息发送
4.6.消息接收
在注册的Activity中进行重写onEventMainThread()方法来进行处理接收消息(除了这个方法以外,还有另外三个方法,具体我们会在下一篇文章中进行介绍)
~~~
/**
* 收到消息 进行相关处理
* @param event
*/
public voidonEventMainThread(TestEventFirst event) {
textView_one.setText(event.getMsg());
showToastMsgShort(event.getMsg());
}
~~~
其中方法中的参数TestEventFirst就是发送过来的消息类,具体发送的消息全部已经封装在里面了。我们只需要使用event对象进行获取处理即可。
4.7.完整第一个Activity和第二个Activity代码如下:
~~~
packagecom.chinaztt.fda.test;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.TextView;
importandroid.widget.Toast;
importcom.chinaztt.fda.event.TestEventFirst;
importcom.chinaztt.fda.ui.R;
importcom.chinaztt.fda.ui.base.BaseActivity;
importcom.chinaztt.fda.utils.Log;
importorg.androidannotations.annotations.Click;
importorg.androidannotations.annotations.EActivity;
importorg.androidannotations.annotations.ViewById;
importorg.w3c.dom.Text;
importde.greenrobot.event.EventBus;
/**
* 当前类注释:EventBus组件间数据通信实例
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.test
* 作者:江清清 on 15/11/3 13:14
* 邮箱:jiangqqlmj@163.com
* QQ: 781931404
* 公司:江苏中天科技软件技术有限公司
*/
@EActivity
public classEventBusTestActivity extendsBaseActivity{
Button button_one;
TextView textView_one;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.event_bus_test_layout);
EventBus.getDefault().register(this);
button_one=(Button)this.findViewById(R.id.button_one);
textView_one=(TextView)this.findViewById(R.id.textView_one);
button_one.setOnClickListener(newView.OnClickListener() {
@Override
public void onClick(View v) {
openActivity(EventBusTestTwoActivity_.class);
}
});
}
/**
* 收到消息 进行相关处理
* @param event
*/
public voidonEventMainThread(TestEventFirst event) {
textView_one.setText(event.getMsg());
showToastMsgShort(event.getMsg());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
~~~
~~~
packagecom.chinaztt.fda.test;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.Button;
importcom.chinaztt.fda.event.TestEventFirst;
importcom.chinaztt.fda.ui.R;
importcom.chinaztt.fda.ui.base.BaseActivity;
importorg.androidannotations.annotations.Click;
importorg.androidannotations.annotations.EActivity;
importorg.androidannotations.annotations.ViewById;
importde.greenrobot.event.EventBus;
/**
* 当前类注释:
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.test
* 作者:江清清 on 15/11/3 14:25
* 邮箱:jiangqqlmj@163.com
* QQ: 781931404
* 公司:江苏中天科技软件技术有限公司
*/
@EActivity
public classEventBusTestTwoActivity extends BaseActivity {
Button button_two;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.event_bus_test_two_layout);
button_two=(Button)this.findViewById(R.id.button_two);
button_two.setOnClickListener(newView.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new TestEventFirst("我是第二个Activity回传的信息...."));
EventBusTestTwoActivity.this.finish();
}
});
}
}
~~~
到此我们的EventBus的基本使用已经讲完了,看一下上面的效果演示,具体深入详解以及其他的几个方法的介绍和相关源代码分析会在下一篇文章中进行讲解。
我们的项目已经配置集成了消息总线EventBus的例子.欢迎大家去Github站点进行clone或者下载浏览:[https://github.com/jiangqqlmj/FastDev4Android](https://github.com/jiangqqlmj/FastDev4Android) 同时欢迎大家star和fork整个开源快速开发框架项目~
- 前言
- Android快速开发框架介绍(一)
- Android首页图片自动无限循环轮播Gallery+FlowIndicator(二)
- Android 列表下拉刷新组件PullToRefreshListView使用(三)
- Android 数据缓存器ACache的详解和使用(四)
- Android崩溃异常捕捉CustomCrash,提升用户体验(五)
- Android实现沉浸式状态栏(六)
- AndroidAnnnotations注入框架介绍和Android Studios基本配置(七)
- AndroidAnnnotations注入框架的工作原理(八)
- AndroidAnnnotations注入框架使用之注入组件Components(九)
- AndroidAnnnotations注入框架使用之Injection标签详解(十)
- AndroidAnnnotations注入框架使用之事件绑定Event Binding(十一)
- AndroidAnnnotations注入框架使用之线程处理Threading(十二)
- AndroidAnnnotations注入框架使用之第三方框架集成RoboGuice(十三)
- AndroidAnnnotations注入框架使用之第三方框架集成Otto事件总线(十四)
- AndroidAnnnotations注入框架使用之第三方框架集成OrmLite(十五)
- AndroidAnnnotations注入框架使用之最佳实践之Adapters和lists(十六)
- AndroidAnnnotations注入框架使用之最佳实践SharedPreferences(十七)
- Android MVP开发模式详解(十九)
- 消息总线EventBus的基本使用(二十)
- 消息总线EventBus源码分析以及与Otto框架对比(二十一)
- 列表头生成带文本或者字母的图片开源库TextDrawable使用和详解(二十二)
- 重写WebView网页加载以及JavaScript注入详解(二十三)
- BaseAdapterHelper的基本使用介绍,让你摆脱狂写一堆Adapter烦恼(二十四)
- BaseAdapterHelper详解源码分析,让你摆脱狂写一堆Adapter烦恼(二十五)
- Volley完全解析之基础使用(二十六)
- Volley完全解析之进阶最佳实践与二次封装(二十七)
- RecyclerView完全解析,让你从此爱上它(二十八)
- RecyclerView完全解析之打造新版类Gallery效果(二十九)
- RecyclerView完全解析之结合AA(Android Annotations)注入框架实例(三十)
- RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
- CardView完全解析与RecyclerView结合使用(三十二)
- 神器ViewDragHelper完全解析,妈妈再也不担心我自定义ViewGroup滑动View操作啦~(三十三)
- 神器ViewDragHelper完全解析之详解实现QQ5.X侧滑酷炫效果(三十四)
- 实例解析之SwipeRefreshLayout+RecyclerView+CardView(三十五)
- HorizontalScrollView,Fragment,FragmentStatePagerAdapter打造网易新闻Tab及滑动页面效果(三十六)
- Android Design支持库TabLayout打造仿网易新闻Tab标签效果(三十七)
- 打造QQ6.X最新版本侧滑界面效果(三十八)