EventBus的使用(三)粘性事件

          通过之前的两篇博客,相信大家已经对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 将最新的粘性事件保存在内存中,粘性事件可以被传递给订阅者。

       通过一个例子来了解下:

       看一张效果图:

       EventBus的使用(三)粘性事件_第1张图片

       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;
        }
    }
}

这就是EventBus粘性事件的所有步骤,看完这三篇关于EventBus的博客,希望对您有所帮助~






你可能感兴趣的:(EventBus的使用(三)粘性事件)