快来,一站式带你了解EventBus!

小咪咪 2024-04-08 11:08 142阅读 0赞

EventBus详解

利用很少的代码,来实现多组件间通信.

66192a59687d4f78841f6afd5b9cee50.png

使用EventBus,主要的就是三个方面:

  1. 订阅者(Subscriber)的register,unregister
  2. 发布者(publisher)通过post,postSticky方法发送事件
  3. 通过subscriber注解定义的方法来接收事

使用方法

1.创建一个事件类型,消息事件类型可以是string,int等常见类,也可以是自己自定义一个事件类,方便管理。

  1. public class MessageEvent {
  2. public static final int MESSAGE_UPDATE_MINE_SCENE_LIST = 0;
  3. public static final int MESSAGE_GUIDE_PRESET_SCENE = 1;
  4. public static final int MESSAGE_GUIDE_TO_MINE_SCENE = 2;
  5. public static final int MESSAGE_GUIDE_MINE_SCENE_MANAGE = 3;
  6. public static final int MESSAGE_GUIDE_ADD_SCENE = 4;
  7. public static final int MESSAGE_GUIDE_DONE = 5;
  8. public static final int MESSAGE_JUMP_AND_UPDATE_MINE_SCENE = 6;
  9. public static final int MESSAGE_PUSH_UPDATE_SCENE_ACTIVE_STATUS = 7;
  10. public final String mMessage;
  11. public final int mCode;
  12. public final int mSceneId;
  13. public static MessageEvent getInstance(String message, int code) {
  14. return new MessageEvent(message, code);
  15. }
  16. private MessageEvent(String message, int code) {
  17. mMessage = message;
  18. mCode = code;
  19. mSceneId = 0;
  20. }
  21. private MessageEvent(String message, int code, int sceneId) {
  22. mMessage = message;
  23. mCode = code;
  24. mSceneId = sceneId;
  25. }
  26. }

2、在需要订阅事件的模块中,注册eventbus和取消eventbus

  1. @Override
  2. protected void onStart() {
  3. super.onStart();
  4. EventBus.getDefault().register(this);
  5. }
  6. @Override
  7. protected void onDestroy() {
  8. super.onDestroy();
  9. EventBus.getDefault().unregister(this);
  10. }

关于EventBus的注册问题,说几点。

注册完了,在不用的时候千万别忘了unregister。

不能重复注册。注册之后,没有unregister,然后又注册了一次。

register与unregister的时间根据实际需求来把控,官方的例子是在onStart()回调方法进行注册,onStop()回调方法进行unregister(),这边根据需求做了改动。

3、在需要接受事件的类中进行好register之后,需要在该类中创建一个方法来接收事件消息。

  1. @SuppressWarnings("all")
  2. @Subscribe(threadMode = ThreadMode.MAIN)
  3. public void onMessageEvent(MessageEvent event) {
  4. if (event == null) {
  5. return;
  6. }
  7. if (event.mCode == MessageEvent.MESSAGE_GUIDE_TO_MINE_SCENE) {
  8. //监听到这个事件后的具体操作
  9. } else if (event.mCode == MessageEvent.MESSAGE_GUIDE_ADD_SCENE) {
  10. //监听到这个事件后的具体操作
  11. }
  12. }

创建的这个方法是有要求的。要求有如下几点。

  1. 该方法有且只有一个参数。
  2. 该方法必须是public修饰符修饰,不能用static关键字修饰,不能是抽象的(abstract)
  3. 该方法需要用@Subscribe注解进行修饰。

4、在需要发送事件的地方,调用EventBus的post(Object event),postSticky(Object event)来通知订阅者。

  1. EventBus.getDefault().post(MessageEvent.getInstance(data,
  2. MessageEvent.MESSAGE_UPDATE_MINE_SCENE_LIST));

EventBus的内存泄露

eventBus注册的时候会持有activity的引用,我们在onDestroy反注册。若我们的activity发生异常或系统内存不足对activity强制回收的时候将不会走onDestroy。eventBus持有activity的引用,因此发生内存泄漏。而且当我们再次打开activity时eventBus又会重新注册一次。

解决办法:注册的时候先判断activity是否注册过

  1. if (!EventBus.getDefault().isRegistered(this)) EventBus.getDefault().register(this);

发表评论

表情:
评论列表 (有 0 条评论,142人围观)

还没有评论,来说两句吧...

相关阅读