使用EventBus来实现数据的传递

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);

然后定义一个onEvent方法来接收我们的消息,与Broadcast的Receiver作用类似。需要注意的是,我们只用定义这个方法就好,它并不是一个接口什么的,也不需要其他任何操作。因为EventBus会对所有方法进行遍历,然后找到onEvent这个方法(事实上还可以是其他的一些方法),并将消息传递给它。

    public void onEvent(MessageEvent event){
        Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
    }

3、接收部分已经完成了,接下来再来实现发送。发送更简单,只需一行代码就轻松搞定。

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);
    }

是不是相当方便?对了,刚开始介绍的onEvent这个方法执行在哪个线程是由post方法的那个线程决定的,它执行在哪个线程onEvent就执行在哪个线程。



你可能感兴趣的:(Android相关)