上一篇EventBus3.0使用(一)
Sticky Events 粘性事件
Sticky Events可以允许事件发布了,再注册订阅,订阅者才处理的特殊类型的事件。Android中就有这样的实例,也就是Sticky Broadcast,即粘性广播。正常情况下如果发送者发送了某个广播,而接收者在这个广播发送后才注册自己的Receiver,这时接收者便无法接收到刚才的广播,为此Android引入了StickyBroadcast,在广播发送结束后会保存刚刚发送的广播(Intent),这样当接收者注册完Receiver后就可以接收到刚才已经发布的广播。这就使得我们可以预先处理一些事件,让有消费者时再把这些事件投递给消费者。
一个很常见的例子
ActivityA跳转到ActivityB时传递用户User,按一般的做法,首先User必须实现序列化接口,然后User需放入Intent中,在ActivityB中又需要从Intent中解析出User。现在使用EventBus 的Sticky Events实现一下,以下是伪代码。
User 类
public class User {
String name ;
String phoneNum;
// 其他字段省略
public User(String aName) {
name = aName ;
}
// 代码省略
}
ActivityA
public class ActivityA extends Activity {
// 某个点击事件
@Override public void onClick(View v) {
User aUser = new User("Mr.Simple");
aUser.phoneNum = "123456"; // 其他数据
// 发布Sticky事件
EventBus.getDefault().postSticky(aUser);
// 跳转到ActivityB页面
Intent intent = new Intent(this, ActivityB.class);
startActivity(intent);
}
}
ActivityB
public class ActivityB extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 以Sticky的形式注册
EventBus.getDefault().registerSticky(this);
}
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
private void receiveUser(User info){
// 这里实现你的逻辑即可, info即为传递过来的User对象
}
}
获取和手动删除粘性事件
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
// "Consume" the sticky event
EventBus.getDefault().removeStickyEvent(stickyEvent);
// Now do something with it
}