EventBus3 使用方法

EventBus 3

EventBus 是一個(gè)基于觀察者模式的事件發(fā)布/訂閱框架

資料

Github
Documentation

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)、作用域
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • EventBus 是一個(gè)Android端優(yōu)化的 publish/subscribe 消息總線,簡(jiǎn)化了應(yīng)用程序各個(gè)組...
    王世軍Steven閱讀 1,938評(píng)論 4 21
  • EventBus源碼分析(一) EventBus官方介紹為一個(gè)為Android系統(tǒng)優(yōu)化的事件訂閱總線,它不僅可以很...
    蕉下孤客閱讀 4,089評(píng)論 4 42
  • 原文鏈接:http://blog.csdn.net/u012810020/article/details/7005...
    tinyjoy閱讀 652評(píng)論 1 5
  • 項(xiàng)目到了一定階段會(huì)出現(xiàn)一種甜蜜的負(fù)擔(dān):業(yè)務(wù)的不斷發(fā)展與人員的流動(dòng)性越來(lái)越大,代碼維護(hù)與測(cè)試回歸流程越來(lái)越繁瑣。這個(gè)...
    fdacc6a1e764閱讀 3,329評(píng)論 0 6
  • 文章基于EventBus 3.0講解。首先對(duì)于EventBus的使用上,大多數(shù)人還是比較熟悉的。如果你還每次煩于使...
    Hohohong閱讀 2,423評(píng)論 0 6

友情鏈接更多精彩內(nèi)容