简易的不一样的LiveEventBus

2020-08-28  本文已影响0人  youxiaochen

前言:支持粘性与普通消息事件,支持Lifecycle,既然是LiveData当然就支持DataBinding, 不支持广播消息(与LiveData无关)也不做过多的包装,就直接使用LiveData发送与接收

1:事件源

有大神写的一个LiveEventBus, 一个事件可以注册普通事件接收与粘性事件传递者, 但是在只注册普通事件接收时,生命周期结束自动管理时粘性事件也随之消除, 所以这里将事件源分出粘性事件源与普通事件源, 普通事件源只能注册普通事件接收, 粘性事件源只能注册粘性事件接收

/**
 *  create by you 2019-03
 *  普通事件
 * @param <T>
 */
public class LiveDataEvent<T> extends LiveData<T> {
    /**
     * 接收事件的级别, 默认为CREATED, 也可以设置 STARTED, RESUMED
     */
    @NonNull
    Lifecycle.State activeLevel;

**
 *  create by you 2019-03
 *  粘性事件
 * @param <T>
 *
 */
public class LiveDataStickyEvent<T> extends LiveData<T> {
    /**
     * 接收事件的级别, 默认为CREATED, 也可以设置 STARTED, RESUMED
     */
    @NonNull
    Lifecycle.State activeLevel;

2:保持原有的LiveData, 这样可以直接在ViewDataBinding中使用, 因为在ViewDataBinding中使用LiveData会自动的注册接收Observer到LivecyclerOwner与移除Observer, 如此将事件再封装就没有了这个特性,

binding.setEvent(LiveEventBus.with(EventConstants.testEvent, String.class));
binding.setLifecycleOwner(this);
这里的消息事件就可以直接显示到界面中,也不用自己手动管理

3:支持传递事件中的Lifecycle.State等级,不同的事件可以使接收者有不同的生命周期感知等级, 比如通常使用Lifecycle.State.CREATED时就可以接收消息, 也可以在STARTED, RESUMED时再接收消息, 注册时传入参数即可

    /**
     * 获取普通事件
     * @param key
     * @param type
     * @param <T>
     * @return
     */
    <T> LiveDataEvent<T> getEvent(String key, Class<T> type);

    <T> LiveDataEvent<T> getEvent(String key, Lifecycle.State activeLevel, Class<T> type);

    /**
     * 获取粘性事件
     * @param key
     * @param type
     * @param <T>
     * @return
     */
    <T> LiveDataStickyEvent<T> getStickyEvent(String key, Class<T> type);

    <T> LiveDataStickyEvent<T> getStickyEvent(String key, Lifecycle.State activeLevel, Class<T> type);
附上源码https://github.com/youxiaochen/LiveEventBus
有错误或不足之处欢迎指教
上一篇 下一篇

猜你喜欢

热点阅读