开源框架EventBus(一)
开源框架EventBus(一)
1 什么事EventBus
EventBus是一个android事件发布/订阅的高性能框架,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。优点是开销小,代码更简洁优雅,事件发布者和事件接收者之间的耦合度更小。如果您目前的项目的逻辑非常复杂,例如组件、线程之间大量传参,频繁使用广播的话维护起来比较吃力的话,或许EventBus是一个非常好的选择。
2 优点
- 可以简化android组件(activity、service、broadcast)以及后台线程之间的通讯
- 减少事件发布者和接收者之间的耦合度
- 可以避免使用复杂的逻辑、减少事件发送者和接收者之间易错的依赖,避免由于组件生命周期带来的一系列问题
- 使用非常简单
- 效率非常高
- 轻量级(jar小于50k)
- 目前有1000W的app在使用
- 先进的功能例如:线程调度,支持事件接收的优先级等
3 EventBus实战
3.1 定义一个事件类
package com.sohu.eventbustest;
/**
* Created by yuliu207272 on 2015/5/15.
*/
public class MessageEvent {
private String msg;
public MessageEvent(String msg) {
this.msg = msg;
}
public String getMsg(){
return msg;
}
}
3.2 在activity中的onCreate()方法中注册事件
EventBus.getDefault().register(MainActivity.this);
3.3 定义接收消息的方法
public void onEvent(MessageEvent event){
String msg = event.getMsg();
tvText.setText(msg);
Log.e(Tag, msg);
}
查阅EventBus官方文档可知
接收事件规定有4种
onEvent: 使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作如果执行耗时操作容易导致事件分发延迟。声明下,app中所有的Activity都是在主线程中绘制的。
onEventMainThread:使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackgroundThread: 使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行
mainActivity:
public class SendMessageActivity extends Activity {
private EditText etText;
private Button btnSend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_message);
etText = (EditText)findViewById(R.id.et_text);
btnSend = (Button)findViewById(R.id.btn_send);
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!TextUtils.isEmpty(etText.getText())){
String sendMessage = etText.getText().toString();
EventBus.getDefault().post(new MessageEvent(sendMessage));
}
}
});
}
}
注意:方法中接收的MessageEvent和后面post方法中MessageEvent必须要是一种类型才能接收到消息3.4 发送消息
再新建一个SendMessageActivity,里面一个输入框输入要发送的消息,点击发送后,MainActivity就会收到消息了。
SendMessageActivity:
public class SendMessageActivity extends Activity {
private EditText etText;
private Button btnSend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_message);
etText = (EditText)findViewById(R.id.et_text);
btnSend = (Button)findViewById(R.id.btn_send);
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!TextUtils.isEmpty(etText.getText())){
String sendMessage = etText.getText().toString();
EventBus.getDefault().post(new MessageEvent(sendMessage));
}
}
});
}
}
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.sohu.eventbustest.SendMessageActivity">
<EditText
android:id="@+id/et_text"
android:layout_width="fill_parent"
android:layout_height="60dip" />
<Button
android:gravity="center"
android:textSize="18sp"
android:textColor="#000000"
android:id="@+id/btn_send"
android:layout_width="match_parent"
android:layout_height="60dip"
android:text="发送消息"/>
</LinearLayout>
3.4 测试结果
在SendMessageActivity中的EditText中输入:eventBus message from MrLiu,点击发送后,按返回键,在MainActivity查看
eventBus进阶:http://1029457926.iteye.com/blog/2211820