摘要:EventBus是在看一个开源项目时,偶然之间看到这个框架,不认识,遂学习之,并记录下来。
概述
EventBus 是一个事件发布和订阅的轻量级框架。通过解耦发布者和订阅者简化Android事件传递 。可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法,代码简洁明了。
导入方式
compile ‘org.greenrobot:eventbus:3.0.0’
常用方法
1、定义事件类型(此处为一个自定义类)
public class FirstMessageEvent {
private String msg;
public FirstMessageEvent(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
2、订阅者注册及解绑
//注册
EventBus.getDefault().register(this);
//解绑
EventBus.getDefault().unregister(this);
3、订阅者接收事件
//org.greenrobot:eventbus:3.0.0 已改为自定义接收事件方法
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMyEvent(MessageEvent event) {
String msg = "收到:" + event.getMsg();
Log.d("recive msg", msg);
}
4、发送者发送事件
EventBus.getDefault().post( new FirstMessageEvent("send msg"));
下面先来个简单例子,这个例子,作为替换线程调用Handle实现刷新界面,来熟悉EventBus操作。
一个简单示例
1、创建activity
- xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="orderandcasher.langge.com.ormlitetext.MainActivity">
<Button
android:id="@+id/btn_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="启动线程发送消息"
/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示"
android:layout_centerInParent="true"/>
</RelativeLayout>
- java文件
public class MainActivity extends AppCompatActivity {
private Button button_1;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.text);
button_1 = (Button)findViewById(R.id.btn_1);
button_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
2、创建事件类
简单构造一个数据结构
public class FirstMessageEvent {
private String msg;
public FirstMessageEvent(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
3、订阅者注册和解绑
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
也可以在onCreate中注册,在onDestroy解绑,看情况而定。
4、订阅者自定义函数接收事件
//接收事件,UI线程执行
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMyEvent(FirstMessageEvent event){
String msg = "在UI主线程中收到消息:" + event.getMsg();
Log.d("recive msg", msg);
textView.setText(msg);
Toast.makeText(getApplicationContext(), "lala:"+msg, Toast.LENGTH_SHORT).show();
}
EventBus 包含4个ThreadMode:
- ThreadMode.POSTING:默认使用该模式,表示该方法会在当前发布事件的线程执行
- ThreadMode.MAIN:表示会在UI线程中执行
- ThreadMode.BACKGROUND:若当前线程非UI线程则在当前线程中执行,否则加入后台任务队列,使用线程池调用
- ThreadMode.ASYNC:加入后台任务队列,使用线程池调用
5、发送者发送事件
button_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开启线程发送事件
new Thread(new Runnable() {
@Override
public void run() {
EventBus.getDefault().post(
new FirstMessageEvent("骚年,给我刷新显示内容吧"+
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
Locale.getDefault()).format(new Date()) ) );
}
}).start();
}
});
完整activity代码:
public class MainActivity extends AppCompatActivity {
private Button button_1;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);//注册
textView = (TextView)findViewById(R.id.text);
button_1 = (Button)findViewById(R.id.btn_1);
button_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开启线程发送事件
new Thread(new Runnable() {
@Override
public void run() {
//send event
EventBus.getDefault().post(
new FirstMessageEvent("骚年,给我刷新显示内容吧"+
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
Locale.getDefault()).format(new Date()) ) );
}
}).start();
}
});
}
//接收事件,当前发布事件的线程执行
/* @Subscribe
public void onEventThread(FirstMessageEvent event) {
String msg = "在发送者的线程中收到消息:" + event.getMsg();
Log.d("recive msg", msg);
textView.setText(msg); // 非ui线程不能操作控件
}*/
//接收事件,UI线程执行
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMyEvent(FirstMessageEvent event){
String msg = "在UI主线程中收到消息:" + event.getMsg();
Log.d("recive msg", msg);
textView.setText(msg);
Toast.makeText(getApplicationContext(), "lala:"+msg, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//解绑
}
}
参考
想了解EventBus,下面2篇文章真的很不错,强烈推荐
1、http://blog.csdn.net/harvic880925/article/details/40660137
2、http://blog.csdn.net/wl1769127285/article/details/51065015
3、EventBus Github源码