EventBus 3
EventBus 是一個(gè)基于觀察者模式的事件發(fā)布/訂閱框架
資料
Eventbus
老司機(jī)教你 “飆” EventBus 3
設(shè)置
導(dǎo)入
- 配置模組的 build.gradle
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ] // 索引全名
}
}
}
}
dependencies {
compile 'org.greenrobot:eventbus:3.0.0'
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}
初始化
// 設(shè)置為默認(rèn)屬性
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
EventBus eventBus = EventBus.getDefault(); // 設(shè)置完后,使用默認(rèn)即可
// 或者在使用時(shí)再設(shè)置
EventBus eventBus = EventBus.builder().addIndex(new MyEventBusIndex()).build();
// 如果庫(kù)中有EventBusIndex,需要多次添加
EventBus eventBus = EventBus.builder()
.addIndex(new MyEventBusAppIndex())
.addIndex(new MyEventBusLibIndex())
.build();
混淆
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
基本用法
定義事件Event
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
注冊(cè)
訂閱之前需要注冊(cè),activities和fragments一般在 onStart/onStop 中調(diào)用
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
訂閱
四種線程模式,ThreadMode: POSTING/MAIN/BACKGROUND/ASYNC
// 在發(fā)送事件的線程調(diào)用,同步處理
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
doSomethingWith(event);
}
// 主線程調(diào)用
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
// 子線程調(diào)用,非主線程則直接調(diào)用,主線程則開(kāi)單線程調(diào)用
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
saveToDisk(event.message);
}
// 異步調(diào)用,使用線程池在不同的線程調(diào)用
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
backend.send(event.message);
}
發(fā)送
任意地方發(fā)送事件,匹配的事件訂閱方法會(huì)接收事件
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
優(yōu)先級(jí)
@Subscribe(priority = 1); // 優(yōu)先級(jí),默認(rèn)為0
public void onEvent(MessageEvent event) {
// 取消傳遞,只能運(yùn)行在ThreadMode.PostThread
EventBus.getDefault().cancelEventDelivery(event);
}
粘性事件 Sticky Event
事件發(fā)出后一直保存在內(nèi)存中,訂閱方法在之后注冊(cè)也能完成訂閱
用法
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent event) {
textField.setText(event.message);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
取消事件
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
if(stickyEvent != null) {
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
if(stickyEvent != null) {
}
配置
無(wú)訂閱時(shí)無(wú)日志
EventBus eventBus = EventBus.builder()
.logNoSubscriberMessages(false)
.sendNoSubscriberEvent(false)
.build();
拋異常
EventBus eventBus = EventBus.builder().throwSubscriberException(true).build();
修改默認(rèn)
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();
異步執(zhí)行器 AsyncExecutor
- AsyncExecutor就像一個(gè)帶異常處理的線程池
- 異常被自動(dòng)捕獲包裹成ThrowableFailureEvent并發(fā)送
用法
AsyncExecutor.create() // 在 Application 中創(chuàng)建保存實(shí)例
.execute(new AsyncExecutor.RunnableEx() {
@Override
public void run() throws LoginException {
// 不需要捕獲異常
remote.login();
EventBus.getDefault().postSticky(new LoggedInEvent());
}
}
);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleLoginEvent(LoggedInEvent event) {
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleFailureEvent(ThrowableFailureEvent event) {
// 處理異常
}
自定義
AsyncExecutor.builder()- 可定義EventBus實(shí)例、線程池、失敗事件類(lèi)、作用域