EventBus基本用法

EventBus是在Android中使用到的发布-订阅事件总线框架,基于观察者模式,将事件的发送者和接收者解耦,简化了组件之间的通信。

Gradle配置

implementation 'org.greenrobot:eventbus:3.1.1'

自定义事件类

public class EventModel {
    ......
}

普通事件处理

在Activity和Fragment生命周期中进行注册/注销订阅者

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    EventBus.getDefault().register(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
 }

发送事件

EventBus.getDefault().post(eventModel);

处理事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(EventModel eventModel) {
    ......
}

粘性事件处理

在事件发送之后再订阅该事件也能收到该事件
粘性事件场景举例:如需要从A页面传递一序列化对象Obj经过B(创建)页面到达C(创建)页面,通常使用intent方式可能会产生令人头痛的样板代码,而使用postSticky进行粘性事件发送,可有效缓解这一问题

发送粘性事件

EventBus.getDefault().postSticky(new EventModel("粘性事件"));

注册粘性事件(如在onClick中注册)

XXX.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().register(MainActivity.this);
            }
        });

处理粘性事件

@Subscribe(threadMode = ThreadMode.POSTING,sticky = true)
 public void XXX(EventModel eventModel){
    ......
 }

优先级

priority来表示优先级,数值越大,优先级越高。在同一传递线程(ThreadMode)中,较高优先级的订户将在优先级较低的其他订户之前接收事件。默认优先级为0

*注:优先级不会影响具有不同ThreadModes的订阅者的传递顺序!

@Subscribe(priority = 1);
public void XXX(EventModel eventModel) {
   //do something
}

取消事件传递

同一线程下事件的优先级越高接收的数据最快,所以当优先级不想分发事件给低级别的事件时,可以使用cancelEventDelivery方法,入参是订阅的实体参数

@Subscribe(priority = 1000,threadMode = ThreadMode.POSTING)
public void onEvent(EventModel eventModel){
    // 取消事件传递
    // 只有在threadMode = ThreadMode.POSTING情况下,低级别的事件无法接收到信息
    EventBus.getDefault().cancelEventDelivery(eventModel) ;
}

混淆规则

-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);
}

你可能感兴趣的:(EventBus基本用法)