通过之前的两篇博客,相信大家已经对EventBus的使用已经有所了解,但在实际应用中,使用EventBus就离不开它的粘性事件 。
参考博客:
EventBus的使用(一) http://blog.csdn.net/bo543937071/article/details/53517693
EventBus的使用(二)注解 http://blog.csdn.net/bo543937071/article/details/53538315
EventBus的粘性事件跟EventBus的正常使用实际上并没有很大的区别,在代码中的体现在注解上,它最大的特点就是添加了粘性事件(sticky),同时使用EventBus粘性事件的步骤和顺序也和普通使用有所不同。
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
如果所要完成的需求是要获取最新的数据并进行传递,我们可以考虑使用EventBus粘性事件。EventBus 将最新的粘性事件保存在内存中,粘性事件可以被传递给订阅者。
通过一个例子来了解下:
看一张效果图:
1.创建EventBus粘性事件消息类,设置属性:定义的是String类型,就只能传递String类型事件
public class EventBusStickyMessage { public String Message; public EventBusStickyMessage(String message) { Message = message; } } 2.发送黏性事件到接收页面,关键方法postSticky
EventBus.getDefault().postSticky(new EventBusStickyMessage("我是主页面发送过来的粘性事件"));3.接收黏性事件,在注解里多加了一个属性Sticky,设置为true是启动黏性事件
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true) public void ReceviceMessage(EventBusStickyMessage eventBusStickyMessage){ txtShow2.setText(eventBusStickyMessage.Message); } 4.EventBus的注册以及在onDestroy里解除EventBus的注册。
完整的代码如下(其中布局文件只有一个Button以及TextView很简单,实在不懂可以看我的上一篇博客):
订阅类(EventBus在哪注册,哪就是订阅类):
public class EventBusReceiveActivity extends AppCompatActivity implements View.OnClickListener { private Button btnOK; private TextView txtShow2; //做个标记,以防EventBus会进行多次注册 boolean flag= true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event_bus_receive); initView(); } private void initView() { btnOK = (Button) findViewById(R.id.btnOK); txtShow2 = (TextView) findViewById(R.id.txtShow2); btnOK.setOnClickListener(this); } //3. 接收黏性事件,多了一个属性Sticky,改为true方是启动黏性事件 @Subscribe(threadMode = ThreadMode.MAIN,sticky = true) public void ReceviceMessage(EventBusStickyMessage eventBusStickyMessage){ txtShow2.setText(eventBusStickyMessage.Message); } @Override public void onClick(View v) { switch (v.getId()) { //接收黏性数据,实际就是补上注册的环节,容易迷,所以要用心看,注意你一旦注册eventBus就会接收到消息 case R.id.btnOK: //一旦注册了EventBus就会接收到消息 if(flag){ //4. EventBus注册广播(),参数是上下文. 导入的EventBus请认准org.greenrobot //注意:有注册就必须有解注册(一般在OnDestroy里执行解注册操作),防止内存泄漏,注册一个界面只能注册一次,否则报错 EventBus.getDefault().register(this); //更改标记,使其不会再进行注册,多次注册会报错 flag = false; } break; } } //4. 在onDestroy里解除EventBus注册, // 注意:这里比普通的解除注册还多一步,就是移除黏性事件(是移除所有的还是移除一个,看需求) @Override protected void onDestroy() { //移除所有的粘性事件 EventBus.getDefault().removeAllStickyEvents(); //解除注册 EventBus.getDefault().unregister(this); super.onDestroy(); } }发布消息类:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化控件 initView(); } private void initView() { button = (Button) findViewById(R.id.button); button.setOnClickListener(this); } //2. 发送黏性事件到接收页面,关键方法postSticky @Override public void onClick(View v) { switch (v.getId()) { //发送消息给接受页面,跳转到接收页面 case R.id.button: EventBus.getDefault().postSticky(new EventBusStickyMessage("我是主页面发送过来的粘性事件")); Intent intent = new Intent(this, EventBusReceiveActivity.class); startActivity(intent); break; } } }