AndroidEventBus的使用

越伟泽
2023-12-01

示例代码

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //注册AndroidEventBus
        EventBus.getDefault().register(this);
        //为了看着方便我们在注册后就发送了两个事件,我们可以在任意位置发送事件
        //发送一个事件
        EventBus.getDefault().post(new Event());
        //发送一个标记事件
        EventBus.getDefault().post(new Event(), "type");
    }

    /**
     * 普通的事件监听方法
     */
    @Subscriber
    public void onEvent(Event event) {
        Log.d("onEvent",event.event);
    }

    /**
     * 指定事件监听方法执行的线程
     */
    @Subscriber(mode = ThreadMode.MAIN)
    public void onEventThreadMode(Event event) {
        Log.d("onEventThreadMode",event.event);
    }

    /**
     * 接收指定标记的事件
     */
    @Subscriber(tag = "type")
    public void onEventTag(Event event) {
        Log.d("onEventTag",event.event);
    }


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

    /**
     * 要发送的事件,自己定义
     */
    public class Event {
        public String event = "接收事件";
    }

}

添加依赖

compile ‘org.simple:androideventbus:1.0.5.1’

发送数据

发送数据不用注册AndroidEventBus的,可在任意位置直接调用下面的方法。
EventBus.getDefault().post( event);

可以发送的数据包括基本数据类型,可以是字符串,也可以是对象。

接收事件

1.注册eventbus(在各组件的创建的时候注册,如Activity的onCreat方法)

EventBus.getDefault().register(this);

2.取消注册(在各组件销毁的时候移除避免内存泄漏,如Activity的onDestroy方法)

EventBus.getDefault().unregister(this);

3.实现监听方法    

通过方法中的参数区分不同的事件
    @Subscriber
    public void onEventSubscriber(Event event){
        Log.d("eventbus.Subscriber",event.toString);
    }

指定线程

默认执行在发送消息的线程

指定线程的方法 @Subscriber(tmode = ThreadMode.**)
    ThreadMode是一个枚举类型。它的值如下:
    POST: Subscriber在发布消息(调用post函数的线程,默认的线程)的线程中执行。
    MAIN: Subscriber将在Android主线程中执行。
    ASYNC: Subscriber在异步线程,也就是在独立的线程中执行。

指定事件的一个tag

如果我们要发送的事件被很多方法订阅了,而我们想指定一个或几个方法接收其他订阅方法不接收。这是我们就可以用到AndroidEventBus的一个特性为事件制定一个tag。

发送一个标记tag的事件

EventBus.getDefault().post(event,tag);

创建一个接收tag标记的事件

@Subscriber(tag = "设置的tag")
public void onEventSubscriber(String string){
    Log.d("eventbus.Subscriber",string);
}

黏性事件

黏性事件:事件发出后在接收的事件(一般为先注册才能接收)。

发送一个黏性事件
EventBus.getDefault().postSticky(event);

注册黏性事件的监听(AndroidEventBus注册黏性事件是不用手动移除的)
EventBus.getDefault().registerSticky(this);

黏性事件的接收方法与非黏性事件的接收方法相同,黏性事件也支持更改线程和指定tag。与Eventbus的黏性事件不同,AndroidEventBus的黏性事件可以接收多个,接收后也不清除,所以接收后可以移除该事件。

    移除黏性事件
    EventBus.getDefault().removeStickyEvent(Event.class);
    EventBus.getDefault().removeStickyEvent(Event.class,tag);

黏性事件示例

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //为了演示方便我们在注册前就发送两个黏性事件,可在任意位置发送
        //发送一个事件
        EventBus.getDefault().postSticky(new Event());
        //发送一个标记事件
        EventBus.getDefault().postSticky(new Event(), "type");
        //注册AndroidEventBus黏性事件的监听
        EventBus.getDefault().registerSticky(this);
    }

    /**
     * 普通的事件监听方法
     */
    @Subscriber
    public void onEvent(Event event) {
        Log.d("onEvent", event.event);
        //移除指定的黏性事件
        EventBus.getDefault().removeStickyEvent(Event.class);
    }

    /**
     * 指定事件监听方法执行的线程
     */
    @Subscriber(mode = ThreadMode.MAIN)
    public void onEventThreadMode(Event event) {
        Log.d("onEventThreadMode", event.event);
    }

    /**
     * 接收指定标记的事件
     */
    @Subscriber(tag = "type")
    public void onEventTag(Event event) {
        Log.d("onEventTag", event.event);
        //移除标记事件的黏性事件
        EventBus.getDefault().removeStickyEvent(Event.class, "type");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //黏性事件是不用手动移除的
    }

    /**
     * 要发送的事件,自己定义
     */
    public class Event {
        public String event = "接收事件";
    }


}

AndroidEventBus源码:github

 类似资料: