EventBus 3.0の新特性

5274 ワード

最初の記事:http://yuweiguocn.github.io/
本論文では、EventBus 3.0の新しい特性を紹介します。反射の代わりに、新たに改訂されたインデックスを追加して、性能を向上させ、@Subscribe注釈などを追加します。
『竹の枝の語』楊柳青青江のレベルは、郎江の上で歌を歌う音を聞いています。東の日の出、西の雨、道は晴れではありませんが、晴れではありません。唐、劉禹錫
最初に依存を追加:
compile 'org.greenrobot:eventbus:3.0.0'
イベントを購読
EventBus 3から、私たちはイベントを定期購読する方法に@Subscribeの注釈を追加したいです。方法名は任意に取ってもいいです。私たちは配布スレッドを指定するためにthreadModeを使用することができます。
ThreadModeは四つあります。以前のバージョンと同じです。
// post     ,      
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
    log(event.message);
}

//   Android   
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
  textField.setText(event.message);
}

//       
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
    saveToDisk(event.message);
}

//        
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
    backend.send(event.message);
}

スティッキーイベント
Stickyを送るのは前と同じです。
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
stickyパラメータを指定してtrueで、Stickyイベントを受信します。
@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

// UI updates must run on MainThread
@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);
// Better check that an event was actually posted before
if(stickyEvent != null) {
    // "Consume" the sticky event
    EventBus.getDefault().removeStickyEvent(stickyEvent);
    // Now do something with it
}
スティッキーの除去:
MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
    // Now do something with it
}
優先度とキャンセルイベント
購読の優先度は、デフォルトは0です。
@Subscribe(priority = 1);
public void onEvent(MessageEvent event) {
    ...
}
注意:スレッドモード間の予約者の優先度は配信順序に影響されません。
イベントの配布をキャンセル:
// Called in the same thread (default)
@Subscribe
public void onEvent(MessageEvent event){
    // Process the event
    ...
    // Prevent delivery to other subscribers
    EventBus.getDefault().cancelEventDelivery(event) ;
}
イベントは通常、高い優先順位の予約者によってキャンセルされ得る。イベントの配布をキャンセルするイベント処理方法は、ThreadMode.POSTINGスレッドでのみ実行できます。
インデックス購読(Subscriber Index)
購読インデックスはEventBus 3の新しい特性であり、購読者登録の初期化を加速するためにオプションの最適化である。
私たちはEventBusで提供された注釈プロセッサを通じてコンパイルする時に購読インデックスを作成することができます。インデックスを使用する必要はありませんが、Androidの性能を向上させるためにオススメです。
注意:@Subscriberの注釈を加えた購読者だけがインデックスされ、イベントイベントイベントイベントはpublicです。Java注解プロセッサ自体の制限により、匿名内部クラスの@Subscribe注解は識別されない。
EventBusがインデックスを使用できない場合、動作時に自動的に反射モードに戻ります。だから、まだ正常に働くことができます。ちょっと遅いです。
インデックスを生成する2つの方法があります。
1.annotationProcessorを使用する場合は、Android Gradle Plugin 2.2.0以上のバージョンではなく、2番目の方法を使用してください。私たちはannotationProcessor属性設定eventBus Indexパラメータを追加して、インデックスを生成したい全クラスの名前を指定します。
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'
}
2.android-aptを使用して上のものが使えない場合、Grade Plugin android-aptを使ってEventBus注釈プロセッサを追加することができます。
buildscript {
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    compile 'org.greenrobot:eventbus:3.0.0'
    apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}

apt {
    arguments {
        eventBusIndex "com.example.myapp.MyEventBusIndex"
    }
}
次にコンパイルするとeventBusIndexで指定されたクラスが生成されます。このようにインデックスクラスを指定できます。
EventBus eventBus = EventBus.builder().addIndex(new MyEventBusIndex()).build();
またはデフォルトのインスタンスを使用したい場合:
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
// Now the default instance uses the given index. Use it like this:
EventBus eventBus = EventBus.getDefault();
同じ方法でクラスに適用してもいいです。複数のインデックスクラスがあります。以下の方法で複数のインデックスクラスを指定できます。
EventBus eventBus = EventBus.builder()
    .addIndex(new MyEventBusAppIndex())
    .addIndex(new MyEventBusLibIndex()).build();
混淆
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe ;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    (java.lang.Throwable);
}
参照
  • http://greenrobot.org/eventbus/documentation