EventBus常用使用

使用

step 1:

创建EventBus使用类

1
2
3
4
5
6
class MessageEvent { 
String aaa;
MessageEvent(String toast) {
aaa = toast;
}
}

step2:

注册EventBus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override

protected void onStart() {

super.onStart();

EventBus.getDefault().register(this);

}

@Override

protected void onStop() {

super.onStop();

EventBus.getDefault().unregister(this);

}

stop3:

创建订阅

1
2
3
4
5
6
@Subscribe(threadMode = ThreadMode.MAIN)

public void sendToast(MessageEvent event) {

Toast.makeText(this, event.aaa, Toast.LENGTH_SHORT).show();
}

step4:

开始使用eventBus

1
EventBus.getDefault().post(new MessageEvent("Hello everyone!”))

线程的四种使用模式

  • 1 ThreadMode: POSTING

subscribe默认实用posting模式,在post的线程中执行,为了避免开销

  • 2 ThreadMode: MAIN

  • 在UI 3 ThreadMode: BACKGROUND

如果不在UI线程,直接执行,在UI线程则用新的后台线程,多个方法用同个后台线程执行,顺序执行

  • 4 ThreadMode: ASYNC

开天辟地新线程,不会等待其它线程完成,有一个线程池可以设置,用EventBusBuilder修改默认线程池

配置

http://greenrobot.org/files/eventbus/javadoc/3.0/org/greenrobot/eventbus/EventBusBuilder.html

1
2
3
4
EventBus eventBus = EventBus.builder()
.logNoSubscriberMessages(false)
.sendNoSubscriberEvent(false)
.build();

配置一下信息

EventBus在全局都可以用getDefault()方法获取实例,但是也可以配置默认实例

1
EventBus.builder().sendNoSubscriberEvent(false).installDefaultEventBus();只可以在实例创建之前使用一次,之后会抛出异常

在Application里面做最好

  • Sticky Event

在注册Event后发送事件

1
EventBus.getDefault().postSticky(new MessageEvent("hello everyTwo!"));

之后再另一个地方注册后创建事件的时候会从内存中拿到后继续执行事件

1
2
3
4
5
6
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN) 

public void onEvent(MessageEvent event) {

Toast.makeText(this, event.aaa, Toast.LENGTH_SHORT).show();
}

并且可以随时取消stick Event

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);

if (stickyEvent != null) {

EventBus.getDefault().removeStickyEvent(stickyEvent);

EventBus.getDefault().removeAllStickyEvents();

}

- priorities and event canclelation

@Subscribe(priority = 1)

public void onEvent(MessageEvent event) {

Toast.makeText(this, event.aaa, Toast.LENGTH_SHORT).show();

}

默认的优先级为0

你可以指定优先级来执行哪个方法,但是在不同的ThreadMode优先级不会生效

cancel操作

取消操作,必须在Postion中进行,通常和priority同时使用,之后的操作都会被取消

1
2
3
4
5
6
7
8
9
@Subscribe(priority = 2,threadMode = ThreadMode.POSTING) 

public void sendToast(MessageEvent event) {

Toast.makeText(this, event.aaa + "0", Toast.LENGTH_SHORT).show();

EventBus.getDefault().cancelEventDelivery(event);

}
谢谢您的鼓励~