摘要: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源码