EventBus3.0使用(二)

上一篇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
}

下一篇EventBus3.0使用(三)

你可能感兴趣的:(EventBus3.0使用(二))