EventBus的使用以及消息处理

首先EventBus是什么?

EventBus是一个消息总线,以观察者模式实现发布者/订阅者模式进行松散耦合的Android开源库。使 Widget,Activity,Fragment,Service以及Thread之间能更好的通信。

EventBus

参考文献

EventBus官网地址 
EventBus github地址

使用

在gradle中引入

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    // ......
    compile 'org.greenrobot:eventbus:3.0.0'
}

大功告成,只待调用~~

遇到的问题

当EventBus出现多个订阅者的时候,post同一种类型的消息,发送多条消息时,不知道消息从哪里发出以及订阅在哪块,在这种状况下它的可读性大大降低。下面主要是针对EventBus的使用以及消息处理简单的封装。

为EventBus消息添加一个intent-filter(过滤器)

淡定!没那么牛逼,就是利用intent-filter中action的思想为每种消息体添加一个tag,利用这个tag去辨别订阅到的这条消息是否是自己想要的那条消息。

先定义一个类用来当作消息体
public class EventBusMessage {

    public Object object;// EventBus消息对象

    public int tag;// 消息TAG

    public EventBusMessage(Object object, int tag) {
        this.object = object;
        this.tag = tag;
    }

    public Object getObject() {
        return object;
    }

    public void setObject(Object object) {
        this.object = object;
    }

    public int getTag() {
        return tag;
    }

    public void setTag(int tag) {
        this.tag = tag;
    }
}

对封装EventBus进行封装
public class EventBusHelper {

    private static final String TAG = EventBusHelper.class.getSimpleName();

    /**
     * 注册/销毁
     *
     * @param object
     * @param register 注册状态:true注册,false:销毁
     */
    public static void register(Object object, boolean register) {
        if (object != null) {
            if (register) {
                if (!EventBus.getDefault().isRegistered(object)) {
                    EventBus.getDefault().register(object);
                }
            } else {
                if (EventBus.getDefault().isRegistered(object)) {
                    EventBus.getDefault().unregister(object);
                }
            }
        }
    }

    /**
     * 默认post数据
     *
     * @param object 发送对象
     */
    public static void post(Object object) {
        EventBus.getDefault().post(object);
    }

    /**
     * 带Tag post数据
     *
     * @param subscriber 发送对象
     * @param tag        为发送的对象设置一个TAG,因为EventBus属于观察者模式,设置TAG的目的主要是为了在指定的地方接收指定的消息。
     */
    public static void post(Object subscriber, int tag) {
        EventBusHelper.post(new EventBusMessage(subscriber, tag));
    }

    /**
     * 默认post粘性事件
     *
     * @param object
     */
    public static void postSticky(Object object) {
        EventBus.getDefault().postSticky(object);
    }

    /**
     * 带Tag post粘性事件
     *
     * @param subscriber 发送对象
     * @param tag        为发送的对象设置一个TAG,因为EventBus属于观察者模式,设置TAG的目的主要是为了在指定的地方接收指定的消息。
     */
    public static void postSticky(Object subscriber, int tag) {
        EventBusHelper.postSticky(new EventBusMessage(subscriber, tag));
    }

    public static <T> T getStickyEvent(Object subscriber, Class<T> clazz) {
        if (EventBus.getDefault().isRegistered(subscriber)) {
            return EventBus.getDefault().getStickyEvent(clazz);
        } else {
            Log.e(TAG, "EventBus no register");
            return null;
        }
    }

    /**
     * 删除指定粘性事件
     *
     * @param clazz
     */
    public static <T> T removeStickyEvent(Object subscriber, Class<T> clazz) {
        if (EventBus.getDefault().isRegistered(subscriber)) {
            return EventBus.getDefault().removeStickyEvent(clazz);
        } else {
            Log.e(TAG, "EventBus no register");
            return null;
        }
    }

    /**
     * 删除所有粘性事件
     */
    public static void removeAllStickyEvents(Object subscriber) {
        if (EventBus.getDefault().isRegistered(subscriber)) {
            EventBus.getDefault().removeAllStickyEvents();
        } else {
            Log.e(TAG, "EventBus no register");
        }
    }

    /**
     * 取消事件发送
     *
     * @param object
     */
    public static void cancelEventDelivery(Object subscriber, Object object) {
        if (EventBus.getDefault().isRegistered(subscriber)) {
            EventBus.getDefault().cancelEventDelivery(object);
        } else {
            Log.e(TAG, "EventBus no register");
        }
    }
}

具体使用
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ......
        EventBusHelper.register(this, true); // 注册EventBus
        // ......
        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 发送消息
                EventBusHelper.post(new EventBusMessage("EventBus是一个消息总线", 1001));
            }
        });
    }

    // ......

    @Override
    protected void onDestroy() {
        EventBusHelper.register(this, false); // 销毁EventBus
        super.onDestroy();
    }

订阅消息
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessage(EventBusMessage message) {
        switch (message.tag){
            case 1001:
                Toast.makeText(this, (String) message.object, Toast.LENGTH_SHORT).show();
                break;
        }
    }

这样就能有效的区分哪些消息是当前订阅者需要接收的消息。 

首先EventBus是什么?

EventBus是一个消息总线,以观察者模式实现发布者/订阅者模式进行松散耦合的Android开源库。使 Widget,Activity,Fragment,Service以及Thread之间能更好的通信。

EventBus

参考文献

EventBus官网地址 
EventBus github地址

使用

在gradle中引入

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    // ......
    compile 'org.greenrobot:eventbus:3.0.0'
}

大功告成,只待调用~~

遇到的问题

当EventBus出现多个订阅者的时候,post同一种类型的消息,发送多条消息时,不知道消息从哪里发出以及订阅在哪块,在这种状况下它的可读性大大降低。下面主要是针对EventBus的使用以及消息处理简单的封装。

为EventBus消息添加一个intent-filter(过滤器)

淡定!没那么牛逼,就是利用intent-filter中action的思想为每种消息体添加一个tag,利用这个tag去辨别订阅到的这条消息是否是自己想要的那条消息。

先定义一个类用来当作消息体
public class EventBusMessage {

    public Object object;// EventBus消息对象

    public int tag;// 消息TAG

    public EventBusMessage(Object object, int tag) {
        this.object = object;
        this.tag = tag;
    }

    public Object getObject() {
        return object;
    }

    public void setObject(Object object) {
        this.object = object;
    }

    public int getTag() {
        return tag;
    }

    public void setTag(int tag) {
        this.tag = tag;
    }
}

对封装EventBus进行封装
public class EventBusHelper {

    private static final String TAG = EventBusHelper.class.getSimpleName();

    /**
     * 注册/销毁
     *
     * @param object
     * @param register 注册状态:true注册,false:销毁
     */
    public static void register(Object object, boolean register) {
        if (object != null) {
            if (register) {
                if (!EventBus.getDefault().isRegistered(object)) {
                    EventBus.getDefault().register(object);
                }
            } else {
                if (EventBus.getDefault().isRegistered(object)) {
                    EventBus.getDefault().unregister(object);
                }
            }
        }
    }

    /**
     * 默认post数据
     *
     * @param object 发送对象
     */
    public static void post(Object object) {
        EventBus.getDefault().post(object);
    }

    /**
     * 带Tag post数据
     *
     * @param subscriber 发送对象
     * @param tag        为发送的对象设置一个TAG,因为EventBus属于观察者模式,设置TAG的目的主要是为了在指定的地方接收指定的消息。
     */
    public static void post(Object subscriber, int tag) {
        EventBusHelper.post(new EventBusMessage(subscriber, tag));
    }

    /**
     * 默认post粘性事件
     *
     * @param object
     */
    public static void postSticky(Object object) {
        EventBus.getDefault().postSticky(object);
    }

    /**
     * 带Tag post粘性事件
     *
     * @param subscriber 发送对象
     * @param tag        为发送的对象设置一个TAG,因为EventBus属于观察者模式,设置TAG的目的主要是为了在指定的地方接收指定的消息。
     */
    public static void postSticky(Object subscriber, int tag) {
        EventBusHelper.postSticky(new EventBusMessage(subscriber, tag));
    }

    public static <T> T getStickyEvent(Object subscriber, Class<T> clazz) {
        if (EventBus.getDefault().isRegistered(subscriber)) {
            return EventBus.getDefault().getStickyEvent(clazz);
        } else {
            Log.e(TAG, "EventBus no register");
            return null;
        }
    }

    /**
     * 删除指定粘性事件
     *
     * @param clazz
     */
    public static <T> T removeStickyEvent(Object subscriber, Class<T> clazz) {
        if (EventBus.getDefault().isRegistered(subscriber)) {
            return EventBus.getDefault().removeStickyEvent(clazz);
        } else {
            Log.e(TAG, "EventBus no register");
            return null;
        }
    }

    /**
     * 删除所有粘性事件
     */
    public static void removeAllStickyEvents(Object subscriber) {
        if (EventBus.getDefault().isRegistered(subscriber)) {
            EventBus.getDefault().removeAllStickyEvents();
        } else {
            Log.e(TAG, "EventBus no register");
        }
    }

    /**
     * 取消事件发送
     *
     * @param object
     */
    public static void cancelEventDelivery(Object subscriber, Object object) {
        if (EventBus.getDefault().isRegistered(subscriber)) {
            EventBus.getDefault().cancelEventDelivery(object);
        } else {
            Log.e(TAG, "EventBus no register");
        }
    }
}

具体使用
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ......
        EventBusHelper.register(this, true); // 注册EventBus
        // ......
        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 发送消息
                EventBusHelper.post(new EventBusMessage("EventBus是一个消息总线", 1001));
            }
        });
    }

    // ......

    @Override
    protected void onDestroy() {
        EventBusHelper.register(this, false); // 销毁EventBus
        super.onDestroy();
    }

订阅消息
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessage(EventBusMessage message) {
        switch (message.tag){
            case 1001:
                Toast.makeText(this, (String) message.object, Toast.LENGTH_SHORT).show();
                break;
        }
    }

这样就能有效的区分哪些消息是当前订阅者需要接收的消息。 

猜你喜欢

转载自blog.csdn.net/qq_22714623/article/details/80965609