EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
作为一个消息总线,有三个主要的元素:
Event:事件(可以是任意对象,参考其他博客中都写成xxxEvent,不过我测试了一个任意名字的对象也可以,不知道如果应用中这么写会不会不规范?)
Subscriber:事件订阅者,接收特定的事件(这里常用的是当前的Activity或者Fragment的上下文)
Publisher:事件发布者,用于通知Subscriber有事件发生
简单使用:
1、定义事件类型:public class MyEvent {}`(就上面任意名称的那个对象,也是我们以后事件处理函数中唯一的传参对象)
2、注册订阅者:EventBus.getDefault().register(this)(this代表订阅者Subscriber,以后还会出现很多和这个单词很像的对象)
3、定义事件处理方法:public void onEventMainThread(这个起名以前是有讲究的,也非常古板,差不多等同四书五经了,现在好了很多,改革开放)
4、发送事件:EventBus.getDefault().post(new MyEvent())(执行之前定义的事件处理方法的语句)
如果不看吐槽语,第一遍看这四个使用步骤,我是懵逼的,完全体会不到简单,所以,先放弃这个笼统的概念和“”晦涩“”的源码,先跑个简单的demo试试~
实现的内容是这样的,创建两个Activity,一个A一个B,然后我们通过A跳转到B,然后让B发送一个信息给A,简单来说就是Activity之间的信息传递,如果按照以前,可能会写个广播,可能会使用intent传参,不过EventBus可以让生活变得简单起来~(~ ̄▽ ̄)~
示意图:
第一个界面跳转第二个界面
第一个界面响应UI修改
首先创建一个需要传递的自定的FirstEvent,当然你可以叫别的。
FirstEvent.java
public class FirstEvent {
private String msg;
public FirstEvent(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
然后是响应的Activity,也是订阅者MainActivity.java
我们需要在MainActivity把自己注册成订阅者,并且完成SecondActivity会调用的事件处理函数,不然SecondActivity调他干什么~
MainActivity.java
public class MainActivity extends Activity {
Button btn;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
btn = (Button) findViewById(R.id.btn_try);
tv = (TextView) findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(getApplicationContext(),
SecondActivity.class);
startActivity(intent);
}
});
}
@Subscribe(threadMode = ThreadMode.Main)
public void onEventMainThread(FirstEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
Log.d("harvic", msg);
tv.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
可以注意到,上面的代码中,除了常规的处理以为,我们使用EventBus.getDefault().register(this)注册了当前对象为订阅者,然后相对应的,要在onDestory中解除注册,毕竟EventBus是单例模型,要避免内存泄漏啊。
最后实现了一个叫onEventMainThread的方法,传入我们之前自定义的event,做了一些ui上的处理,这里的处理是设置一个TextView的内容。
这里的函数名起名以前是有讲究的,必须以onEvent开头,后面的界面也是固定的,代表着处理缩在的线程,一共有四种类型,这里的类型代表UI线程。现在可以随意。还有就是函数上面的@SubScribe标签,必须要写,否则程序就跪了。(3.0.0jar包运行结果)。
那么SecondActivity.java是如何发布事件的呢?
SecondActivity.java
public class SecondActivity extends Activity {
private Button btn_FirstEvent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);
btn_FirstEvent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(
new FirstEvent("FirstEvent btn clicked"));
}
});
}
}
SecondActivity通过EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"))来发布一个事件,从而才能调用MainActivity的处理函数。
整个过程非常的清楚明了,而且没有什么代码冗余,很值得学习一下有木有~(o゜▽゜)o☆[BINGO!]
那么更加详细的流程是怎么样的,这就需要看看源码了,哎╮(╯▽╰)╭