EventBus的使用

来源:互联网 发布:淘宝达人账号简介范文 编辑:程序博客网 时间:2024/04/29 23:55

参考

EventBus—github
启舰— EventBus使用详解(一)——初步使用EventBus
启舰— EventBus使用详解(二)——EventBus使用进阶

Gadle

compile 'org.greenrobot:eventbus:3.0.0'

使用方法

涉及到三个地方
1. 新建一个消息类
2. 在你要接受消息的类里面,写一个onMessageEvent方法(新版本需要用注解),在这个方法内部去处理接受到的消息。还必须在生命周期方法里注册和注销EventBus
3. 在你要发消息的类里面,去发消息 EventBus.getDefault().post(new MessageEvent(98));

  1. Define events:

    定义事件,新建一个类,一般这两个类里面会有几个属性,这个属性就是你要发送和传递的值

    public static class MessageEvent {     /* Additional fields if needed */    int age;    public MessageEvent(int age){        this.age=age    }    public int getAge(){       return age;   }}
  2. Prepare subscribers: Declare and annotate your subscribing method, optionally specify a thread mode:

    准备一个订阅者,声明一个方法(这个方法名可以随便起,因为他靠的是注解来识别方法),并用 @Subscribe注解这个方法,指定(可选)一个线程模式
    在你要接受消息的Activity(Service)里添加下面的方法

    @Subscribe(threadMode = ThreadMode.MAIN)  public void onMessageEvent(MessageEvent event) {        /* Do something 拿到传递过来的数据 */    int age=evnt.getAge();    Log.e("tag",age+"");};

    Register and unregister your subscriber. For example on Android, activities and fragments should usually register according to their life cycle:

    在你要接受消息的Activity(Service)的生命周期方法中,注册和注销你的订阅者

     @Override public void onStart() {     super.onStart();     EventBus.getDefault().register(this); } @Override public void onStop() {     super.onStop();     EventBus.getDefault().unregister(this); }
  3. Post events:

    发送事件,在另一个类(Activity)里面发送消息

     EventBus.getDefault().post(new MessageEvent(98));

注意

  1. 消息的接收是根据参数中的类名(MessageEvent)来决定执行哪一个的,多个方法中参数类名一样的话,那么这多个方法都会收到消息

线程(threadMode = ThreadMode.MAIN)

ThreadMode.MAIN
ThreadMode.ASYNC
ThreadMode.BACKGROUND
ThreadMode.POSTING

对照旧版本去理解
onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。

onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。

onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。

onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

原创粉丝点击