您的位置:首页 > 移动开发 > Android开发

Android EventBus简单介绍(一)

2016-09-02 16:33 337 查看
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!]

那么更加详细的流程是怎么样的,这就需要看看源码了,哎╮(╯▽╰)╭
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  EventBus android