EventBus是Android的一个开源项目,它最重要的功能就是可以简化各个组件之间的消息传递,类似于Android自身的广播。但又比广播使用起来方便的多的多。
如果我们想要一个广播来传递消息,我们要先在发送端定义一个Intent,然后putExtra什么的,再sendBroadcast,接收端也得注册一个BroadcastReceiver,又得添加Filter之类的,还得在onReceiver里根据传递过来的Intent来getExtra什么的提取我们想要的消息,天哪,太麻烦了。我们只是想要传递一个消息而已啊。
一直在说EventBus方便,到底怎么方便呢,现在我就从0开始来演示如何利用EventBus来传递我们的消息。
首先下载EventBus的库文件,下载地址:EventBus下载地址,Eclipse环境下下载jar文件并复制到项目的lib文件夹就好。如果是AndroidStudio或者其他环境,参考github/EventBus。
接下来就是如何利用EventBus来实现数据的传递了。要实现数据传递,只需要简单的三步就好:
1、定义一个MessageEvent,这个类就是一个普通的Object,没有任何特殊,我们用它作为消息传递的载体。
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
2、在Activity中注册EventBus以及onEvent。EventBus也需要进行注册,因此我们可以在onCreate中进行注册,方法如下
EventBus.getDefault().register(this);
public void onEvent(MessageEvent event){
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
就这样,我们实现了消息的传递,当然,别忘了在onDestroy中对EventBus进行unregister,方法与register类似。
就这么几行代码,是不是比Broadcast简单的多?而且,可以直接传递对象过来,不需要putExtra之类的封装。开销也比Broadcast小的多。更爽的是,我之前说过,接收端可以是其他的一些方法,这些方法可以作用在不同的线程里,比如说,我们现在想收到消息的时候将它保存起来,那么我们可以直接定义如下的一个方法
public void onEventBackgroundThread(MessageEvent event){
saveToDisk(event.message);
}
这个方法会执行在主线程之外的某个子线程,如果post方法本身就是子线程,那么就与post方法执行在同一线程,需要注意的是,当多个post时,它不会主动新开线程,只会按顺序挨个执行,因此可以保证我们消息都按顺序保存了的。那如果我们想每次收到消息都新开一个线程来执行呢?只需定义如下的方法就好:
public void onEventAsync(MessageEvent event){
backend.send(event.message);
}
这个方法执行在于post及主线程都不相同的线程内。每次post都会新开一个线程。使用该方法时应考虑该方法触发的次数,千万别让线程过多,导致资源消耗过大。最后,最常用的,假如我们想在接受消息的时候更新UI,因为UI只能在主线程进行更新,因此我们希望接收到消息的方法执行在主线程,那么,我们可以直接定义一个如下的方法
public void onEventMainThread(MessageEvent event) {
textField.setText(event.message);
}