EventBus事件总线框架优化

概要

上一篇文章我们了解了EventBus的使用方法,但是使用久了就会发现有些地方还是挺麻烦的,比如每次都要在Activity/Fragment的onCreate方法中进行注册,在onDestory方法中进行销毁,还要写onEventMainThread方法接收消息,而且大部分App在开发的时候都会有一个BaseActivity基类,本来BaseActivity中就承载了许多的公用方法,那么是不是可以把EventBus的这些方法也写在基类中,通过某个开关或者所是方法进行判读是否需要注册消息监听呢,答案是肯定的。

BaseActivity中的注册开关(决定子类是否需要注册事件分发):

/**
 * 是否注册事件分发
 * true表示绑定EventBus事件分发,默认不绑定,
 * 子类需要绑定的话
 *
 * @return
 */
public boolean isRegisterEventBus() {
    return false;
}

BaseActivity中的onCreate方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (isRegisterEventBus()) {
        EventBusUtil.register(this);
    }
}

BaseActivity中的onDestory方法:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (isRegisterEventBus()) {
        EventBusUtil.unregister(this);
    }
}

接下来就是监听消息的入口了:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventBusCom(MessageEvent event) {
    if (event != null) {
        receiveEvent(event);
    }
}

/**
     * 接收到分发的事件
     *
     * @param event
     */
    public void receiveEvent(MessageEvent event) {
        // 子类重写方法
    }

当接收到EventBus的消息后,onEventBusCom方法会被调用,子类Activity只需要重写receiveEvent方法即可接收到消息,并提取出event中携带的数据,进行相关的操作。而且,如果子类不需要接收任何消息,不必做任何操作,应为默认是不注册消息监听的。

代码中的EventBusUtils类也是自己重新定义的,方便消息的注册、解绑和消息的发送,Android原生API中总是有许多累赘的东西,比如弹一个吐司,每次都要写很长的一句代码:

Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();

而进行二次封装后变成:

public void toast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}

下次只需要传递一个你想提示的文字,调用toast方法即可,简单方便了很多。

以下是EventBusUtils的代码:

public class EventBusUtil {

    public static void register(Object subscriber) {
        EventBus.getDefault().register(subscriber);
    }

    public static void unregister(Object subscriber) {
        EventBus.getDefault().unregister(subscriber);
    }

    public static void sendEvent(MessageEvent event) {
        EventBus.getDefault().post(event);
    }

}

经过这么一改造,代码瞬间就高大上了一些了,更加具有结构性,菜鸟们还在每个具体的Activity中进行注册、销毁、监听,而你从现在开始就不用这样啦。