前言:支持粘性与普通消息事件,支持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);
网友评论