EventBus 3.0 事件总线

一、什么是事件总线?

它是针对Android中的四大组件Activity,Service,BroadcastReceiver和ContentProvider之间实现的统一的订阅、发布,以实现它们之间的进程通信。其原理是采用了观察者模式的开发机制。

二、常用的事件总线框架

EventBus和Otto

EventBus的基本使用官方参考:https://github.com/greenrobot/EventBus

Otto的基本使用官方参考:http://square.github.io/otto/

 

三、EventBus的使用

1.在build.gradle中添加依赖库

dependencies {

compile fileTree(include: ['*.jar'], dir: 'libs')
  testCompile 'junit:junit:4.12'
compile 'org.greenrobot:eventbus:3.0.0'
}

2.注册和反注册

一般在Activity或者Fragment中的onCreat方法中进行注册,在onDestroy中进行反注册。

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    EventBus.getDefault().register(this);

}

@Override

protected void onDestroy() {

    super.onDestroy();

    EventBus.getDefault().unregister(this);

}

3.订阅者

类似广播,但是有别于2.4版本,你不必再去约定OnEvent方法开头了(看不懂没关系),在3.0版本之后订阅者有四种形式(就是四种线程模式)的接收方式:

ThreadMode.MAIN:如果线程模式是MAIN,那么无论事件是在什么线程发送出来的,该事件处理函数都会在UI线程中执行,可以用来更新UI,但是注意不要做耗时操作。

ThreadMode.POSTING:如果订阅者在使用事件处理函数时候指定了这种线程模式,那么该事件是在哪个线程发布出来的,那么处理函数就会在这个线程中执行,也就是说发布事件和接收事件是在同一个线程。在这种线程模式下尽量避免做耗时操作,因为会阻塞事件的传递,很有可能引起ANR。

ThreadMode.ASYNC:这种线程模式就是说,无论事件在哪个线程发布,该事件的处理函数都会在新建的子线程中执行,此事件处理函数中是不能进行UI操作的。

ThreadMode.BACKGROUND:这种线程模式意思是,如果事件是在UI线程中发布出来的,那么该事件处理函数就会在子线程中执行;如果事件是在子线程中发布的,那就还在这个线程中处理。在这种模式下是不能更新UI操作的。

个人觉得第一种比较常用,后面三种用的频率很低。

@Subscribe(threadMode = ThreadMode.MAIN)
public void receiveEventBus(MessageEvent event) {
    Log.v(TAG, "EventBus is running" + event.getMessage());

//在此执行你要进行的操作(更新UI,接收消息等)
}

使用了@Subscribe注解,其含义为订阅者,在其内传入了threadMode,我们定义为ThreadMode.MainThread, 其含义为该方法在UI线程完成,这样你就不要担心抛出异常啦。receiveEventBus 是一个函数名,你自己可 以任意定义。

4.发布者

发布者可以在你程序的任意位置进行发布,当它执行之后,订阅者回立即收到消息,并进行处理。

EventBus.getDefault().post(new MessageEvent ());或者EventBus.getDefault().post(new MessageEvent (msg));

由于我们的post可能是一个对象,所以我们需要定义一个class类MessageEvent.java

public class MessageEvent {
    private String msg;
    public PersonEvent() {
    }
    public PersonEvent(String msg) {
        msg = msg;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

好了,到这里EventBus事件总线就完成了,赶快去尝试一下能否正常运行吧!

如果您觉得对你有用,请帮我顶一顶。


猜你喜欢

转载自blog.csdn.net/wang_1220/article/details/52003076