EventBus3的基本使用指南

使用EventBus可以省略繁杂的Handler,效果也是类似的,使用方法也很简单。这里从官网上面做一个小小的总结,可以看得更全面一些。

入门贴

官方教程

定义事件

事件就是一个普通的Java类,POJO就好。

public class MessageEvent {
    public final String message;
    public MessageEvent(String message) {
        this.message = message;
    }
}

订阅事件

事件的订阅者会被调用以处理相应的事件。使用@Subscribe定义。EventBus 3对函数名没有要求。


// 当MessageEvent事件被发送的时候,此方法会被调用(在主线程中)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}

//当SomeOtherEvent方法被发送的时候,此方法会被调用
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
    doSomethingWith(event);
}

事件的订阅函数所在的地方,需要先声明订阅,并且最好在相应的时候取消事件的订阅。只有订阅了,才会收到事件消息。因此一般会在ActivityFragment的生命周期中进行上述操作。

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}

发送事件

你可以在任何代码中进行事件的发送。所有对匹配此事件的订阅者都将会收到此事件。

EventBus.getDefault().post(new MessageEvent("Hello everyone!"));

指定订阅者函数执行的线程

如果不指定线程,那么将默认与发送事件处于相同的线程。

ThreadMode 说明
POSTING 默认模式,与发送事件时所处的线程相同。
MAIN 主线程。注意在订阅函数内不用做太多耗时的操作,以免堵塞主线程。如果事件是在主线程中发送的,那么订阅者将会立即执行对于的函数。
MAIN_ORDERED 主线程。如果已经有一个订阅者的函数在执行,那么将等待它执行完毕后,才执行当前订阅者的函数。与其名字相呼应吧!
BACKGROUND background线程。如果事件不是在主线程中发送的,那么订阅者将立刻在此发送线程中执行;如果是在主线中发送的,那么将会开启一个线程,并在此线程中依次发送所有的事件,当订阅者收到此事件时,将会在此线程中执行吧!
ASYNC 会开启一个独立的线程来执行订阅者函数。可以考虑将比较耗时的操作设为此模式,如网络访问。这些线程会被一个线程池管理,以提高重新利用的效率。

配置

示例是配置当没有订阅者时的一些操作。

EventBus eventBus = EventBus.builder()
    .logNoSubscriberMessages(false)
    .sendNoSubscriberEvent(false)
    .build();

上面获取到EventBus实例的方式与之前示例中获取到EventBus实例不太一样。其中的差距此处获取到的只是当前的实例,后者是默认的实例。如何才能配置默认的实例呢?

EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();

其中installDefaultEventBus()只能调用一次。

参考:http://greenrobot.org/eventbus/documentation/

你可能感兴趣的:(Android)