EventBus是一款針對Android優化的發佈/訂閱事件總線。主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、線程之間傳遞消息.優勢是開銷小,代碼更優雅。以及將發送者和接收者解耦。EventBus在GitHub上的開源庫地址,剛開始使用的能夠看一下,GitHub上有最基本的使用方法。java
最基本的引用以下:android
compile 'org.greenrobot:eventbus:3.1.1'
複製代碼
添加這個引用以後就可使用EventBus了,可是EventBus更新3.1.1以後採用了註解的方式,接收的函數名能夠自定義,可是傳遞效率就不是很高了,所以須要加速處理,固然,也能夠不使用註解和加速,加速引用以下:git
//defaultConfig 下加入代碼
defaultConfig{
javaCompileOptions {
annotationProcessorOptions {
arguments = [eventBusIndex: 'com.yz.ui.fragmentdemo.MyEventBusIndex']
}
}
}
//dependencies 下加入代碼
dependencies{
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}
複製代碼
注意:javaCompileOptions這裏是生成加速配置文件,MyEventBusIndex就是生成文件的名字,前面就是你的包名,編譯以後能夠查看:github
這一步驟沒有也同樣可使用,只是有一些需求能夠在這裏配置,如:加速、設置debug模式下要拋出異常等app
//修改默認實現的配置,記住,必須在第一次EventBus.getDefault()以前配置,且只能設置一次。建議在application.onCreate()調用
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).addIndex(new MyEventBusIndex()).installDefaultEventBus();
// 這樣每次獲取到默認實例,都是使用Subscriber Index的了,代碼獲得了精簡。
EventBus eventBus = EventBus.getDefault();
複製代碼
public class MessageEvent {
private Object msg;
public MessageEvent(Object msg) {
this.msg = msg;
}
public Object getMsg() {
return msg;
}
public void setMsg(Object msg) {
this.msg = msg;
}
@Override
public String toString() {
return "MessageEvent{" +
"msg=" + msg +
'}';
}
}
複製代碼
注意:這裏我是用Object類型是爲了傳遞各類類型的數據,使這個事件類變成通用的事件類,若是你的事件須要同時存在可在該類中加入一個標識來區別本身的事件。異步
EventBus.getDefault().register(this);//註冊
EventBus.getDefault().unregister(this);//註銷
複製代碼
注意:官方是推薦將註冊寫到onStart,將註銷寫到onStop中,固然你也能夠更具本身的需求來改變的ide
EventBus.getDefault().post(new MessageEvent("發送事件"));
複製代碼
注意:EventBus是爲了給已經存在的窗體傳遞信息,並且訂閱者必需要註冊且不能被註銷了,不然接收不到消息函數
EventBus.getDefault().postSticky(new MessageEvent("發送粘性事件"));
複製代碼
注意:粘性的事件發送後只要不取消會一直存在工具
在接收數據須要處理事件的窗體中定義訂閱事件處理函數:post
@Subscribe(threadMode = ThreadMode.POSTING, priority = 2, sticky = true)
public void onMessageEventPost(MessageEvent data) {
}
複製代碼
注意:threadMode指線程模式,priority指事件的優先級,sticky是不是粘性事件
EventBus.getDefault().cancelEventDelivery(event);
複製代碼
注意:事件取消僅限於ThreadMode.PostThread下才可使用
//指定粘性事件刪除
T stickyEvent = EventBus.getDefault().getStickyEvent(eventType);
if (stickyEvent != null) {
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
//刪除全部粘性事件
EventBus.getDefault().removeAllStickyEvents();
複製代碼
EventBus封裝工具類以下:
/**
* 殘夢 EventBus事件處理
* <p>
* EventBus是爲了給已經存在的窗體傳遞信息,並且訂閱者必需要註冊且不能被註銷了,不然接收不到消息
* 給還未建立的窗體傳遞信息須要用粘性事件
* <p>
* Created by dell on 2018/1/26.
*/
public class EventBusUtils {
private static final String TAG = EventBusUtils.class.getSimpleName();
/**
* 控制日誌在開發的時候輸出,發佈的時候不輸出,在開發的時候錯誤崩潰,而發佈的時候不崩潰
* 打開加速
*/
public static void openIndex() {
//修改默認實現的配置,記住,必須在第一次EventBus.getDefault()以前配置,且只能設置一次。建議在application.onCreate()調用
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).addIndex(new MyEventBusIndex()).installDefaultEventBus();
// 這樣每次獲取到默認實例,都是使用Subscriber Index的了,代碼獲得了精簡。
EventBus eventBus = EventBus.getDefault();
}
/**
* 註冊EventBus
*
* @param subscriber 訂閱者
*/
public static void register(Object subscriber) {
if (!EventBus.getDefault().isRegistered(subscriber)) {
EventBus.getDefault().register(subscriber);
}
}
/**
* 注消EventBus
*
* @param subscriber 訂閱者
*/
public static void unregister(Object subscriber) {
EventBus.getDefault().unregister(subscriber);
}
/**
* 發佈訂閱事件
*
* @param Publisher 發佈者
*/
public static void post(Object Publisher) {
EventBus.getDefault().post(Publisher);
}
/**
* 發佈粘性訂閱事件
*
* @param Publisher 發佈者
*/
public static void postSticky(Object Publisher) {
EventBus.getDefault().postSticky(Publisher);
}
/**
* 移除指定的粘性訂閱事件
*
* @param eventType 移除的內容
* @param <T>
*/
public static <T> void removeStickyEvent(Class<T> eventType) {
T stickyEvent = EventBus.getDefault().getStickyEvent(eventType);
if (stickyEvent != null) {
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
}
/**
* 取消事件傳送 事件取消僅限於ThreadMode.PostThread下才可使用
* 不取消事件就會一直存在
*
* @param event
*/
public static void cancelEventDelivery(Object event) {
EventBus.getDefault().cancelEventDelivery(event);
}
/**
* 移除全部的粘性訂閱事件
*/
public static void removeAllStickyEvents() {
EventBus.getDefault().removeAllStickyEvents();
}
複製代碼