EventBus使用详解,android插件化和热修复区别

本文详细介绍了EventBus中的粘性事件如何处理发布者与订阅者的时间差问题,以及如何设置和取消事件优先级。通过示例展示了在Android应用中如何使用EventBus进行事件传递,并探讨了EventBus的订阅者索引优化和HermesEventBus在进程间通信的应用。
摘要由CSDN通过智能技术生成

D/MainActivity: onMessageEventMain(), current thread is main

D/MainActivity: onMessageEventMainOrdered(), current thread is main

EventBus粘性事件

EventBus粘性事件所处理的问题是:发布者先发送了事件,但是此时订阅者还未产生,一段时间后订阅者才订阅了该事件,也就是使得在发送事件之后订阅者再订阅该事件也能收到该事件。

比如需求是在第一个Activity中发送事件,然后启动第二个Activity接收事件进行处理 ,但此时在打开第二个Activity时是接收不到消息的,主要是因为第二个Activity在第一个Activity发送事件时还未完成EventBus的注册,此时就需要使用粘性事件处理。

接收粘性事件的订阅者方法注解必须添加sticky = true属性:

@Subscribe(sticky = true)

public void onMessageEvent(MessageEvent event) {

}

发布粘性事件使用postSticky():

EventBus.getDefault().postSticky(new MessageEvent(“Hello EventBus!”));

发布一个粘性事件之后,EventBus将一直缓存该粘性事件。如果想要移除粘性事件,那么可以使用如下方法:

// 移除指定的粘性事件

removeStickyEvent(Object event);

// 移除指定类型的粘性事件

removeStickyEvent(Class eventType);

// 移除所有的粘性事件

removeAllStickyEvents();

例子:

点击MainActivity的按钮时,先发送一个粘性事件,再启动SecondActivity

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_go:

EventBus.getDefault().postSticky(new MessageEvent(“Hello”));

Intent intent = new Intent(this, SecondActivity.class);

startActivity(intent);

break;

default:

break;

}

}

在打开的SecondActivity中订阅该事件:

public class SecondActivity extends Activity {

private final static String TAG = SecondActivity.class.getSimpleName();

private Button mSendBtn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

initView();

EventBus.getDefault().register(this);

}

private void initView() {

mSendBtn = (Button) findViewById(R.id.btn_send);

}

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)

public void onMessageEvent(MessageEvent event) {

Log.i(TAG, "onMessageEvent: " + event.getMessage());

// 更新界面

mSendBtn.setText(event.getMessage());

// 移除粘性事件

EventBus.getDefault().removeStickyEvent(event);

}

@Override

protected void onDestroy() {

super.onDestroy();

EventBus.getDefault().unregister(this);

}

}

输出:

在这里插入图片描述

EventBus事件优先级

EventBus支持在定义订阅者方法时指定事件传递的优先级。默认情况下,订阅者方法的事件传递优先级为0。数值越大,优先级越高。在相同的线程模式下,更高优先级的订阅者方法将优先接收到事件。

注意:优先级只有在相同的线程模式下才有效。如果相同的线程模式下的订阅方法都没有指定优先级(默认优先级为 0),则接收事件的方法顺序会按照方法名的字母排序。

指定事件传递优先级需要在订阅方法注解上添加priority属性:

@Subscribe(priority = 1)

pu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值