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 将最新的粘性事件保存在内存中,粘性事件可以被传递给订阅者。

       通过一个例子来了解下:

       看一张效果图:

      

       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的博客,希望对您有所帮助~






  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Nuxt2 中使用 eventBus 事件总线,可以通过以下步骤实现: 1. 创建一个 eventBus.js 文件 在项目的根目录中,创建一个 eventBus.js 文件,代码如下: ```javascript import Vue from 'vue'; export const eventBus = new Vue(); ``` 这里使用了 Vue 的实例来创建 eventBus,并且将它导出,这样就可以在项目中的任何地方使用它了。 2. 在需要使用 eventBus 的组件中引入 eventBus 在需要使用 eventBus 的组件中,可以使用以下代码来引入 eventBus: ```javascript import {eventBus} from '@/eventBus.js'; ``` 这里的 @ 表示项目的根目录,如果 eventBus.js 文件不在根目录中,那么需要改成相应的路径。 3. 使用 eventBus 发送事件 在需要发送事件的地方,可以使用以下代码来发送事件: ```javascript eventBus.$emit('eventName', data); ``` 这里的 eventName 是事件的名称,data 是传递的数据。 4. 使用 eventBus 监听事件 在需要监听事件的地方,可以使用以下代码来监听事件: ```javascript eventBus.$on('eventName', (data) => { // 处理事件 }); ``` 这里的 eventName 是事件的名称,data 是传递的数据。事件触发后,会执行回调函数中的代码。 总结: 以上就是在 Nuxt2 中使用 eventBus 事件总线的方法,通过使用 eventBus,可以在组件之间方便地进行通信。需要注意的是,eventBus使用需要谨慎,过多的使用可能会导致代码的可读性和维护性降低。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值