四,EventBus3.0 Sticky Events

Sticky Events(粘性事件)

  • 官网直译

某些事件在事件发布后携带一些必要的信息,例如,某些初始化的操作完成,需要先获取到事件数据信息进行使用。或者,如果您有一些传感器或位置数据,并且希望保存最近的值。可以使用粘性事件进行传递,而不需要自己缓存下来。EventBus可以将最近一个特定类型的粘滞事件先保存在内存中。然后,可以将粘性事件传递给订阅者或显式查询。这样,我们不需要写一些逻辑来处理,就可以使用这些数据

  • 粘性事件

粘性事件简单讲,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。其实就是先发送消息,然后再进行注册,注册后再去接收消息,类似使用Intent往新开启的Activity中传递消息.EventBus支持发送黏性事件

  • 粘性事件的使用

粘性事件的使用分两种情况,分别是订阅方法接收处理粘性事件和手动处理粘性事件

  • 订阅方法接收处理粘性事件

在注册订阅之前发送粘性事件

                //在注册之前发送消息
                String str = tvA.getText().toString().trim();
                EventBus
                        .getDefault()
                        .postSticky(str);
                startActivity(EventBusStickyBActivity.class);

在将要接收粘性事件的组件中注册注销粘性事件

    @Override
    public void initUI() {
        setContentView(R.layout.activity_event_bus_sticky_b);
        ButterKnife.bind(this);
        EventBus
                .getDefault()
                .register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

订阅者方法中接收事件,然后进行后续逻辑处理

//接收上个页面传递过来的事件
//注册之后,接收消息
//需要注解中添加sticky = true
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onStickyMessage(String event) {
        tvB.setText(event);
        LogUtils.i(event.concat("----->onStickyMessage!"));
}
  • 手动处理粘性事件
    在注册订阅之前发送粘性事件
                //在注册之前发送消息
                String str2 = tvC.getText().toString().trim();
                EventBus
                        .getDefault()
                        .postSticky(str2);
                startActivity(EventBusStickyCActivity.class);

新页面注册粘性事件后,手动获取粘性事件

    @Override
    public void initUI() {
        setContentView(R.layout.activity_event_bus_sticky_b);
        ButterKnife.bind(this);
        EventBus
                .getDefault()
                .register(this);

        //手动管理stickyevent,但是必须定义接收事件的方法.
        String stickyEvent = EventBus
                .getDefault()
                .getStickyEvent(String.class);
        if (TextUtils.isEmpty(stickyEvent)) {
            tvB.setText("sorry,have not reciver the sticky event!");
        } else {
//接收后,有必要删除粘性事件,这样它们就不会再被传递了
            EventBus
                    .getDefault()
                    .removeAllStickyEvents();
//使用这种方式删除也可以
//EventBus.getDefault().removeStickyEvent(stickyEvent);
            tvB.setText(stickyEvent);
        }
    }


注销粘性事件

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault()
                .unregister(this);
    }

订阅者方法中接收事件,然后不进行后续逻辑处理

//接收上个页面传递过来的事件
//注册之后,接收消息,采用手接受事件,此方法不做任何逻辑处理,
//但是必须定义否则报错.
//需要注解中添加sticky = true
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onStickyMessage(String event) {}

demo源码

你可能感兴趣的:(四,EventBus3.0 Sticky Events)