Android---EventBus详解

来源:互联网 发布:男士发型设计软件推荐 编辑:程序博客网 时间:2024/05/20 12:25

注:EventBus在github上的使用

https://github.com/greenrobot/EventBus

概念:

EventBus是一个发布/订阅的事件总线。它可以让两个组件相互通信,但是它们之间并不相互知晓。 EventBus模式,也被称为 Message Bus模式,    或者 发布者/订阅者(publisher/subscriber)模式。 事件响应有更多的线程选择,EventBus 可以向不同的线程中发布事件。 这里需要理解的是发送事件可以在任何线程中进行,但接收事件需要在特定的线程中处理。你想在哪个线程注册就在哪个线程接收事件,可以是多个地方接收事件消息。哪里有数据,我们可以直接传入事件消息,消息类型是我们自己可以定义的。

传统的传递和EventBus的比较:(四大组件之间传递参数)

  Handler、BroadCastReceiver、intent、Interface 回调,相比之下 EventBus 的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。

EventBus使用:

第一步:gradle

    compile 'org.greenrobot:eventbus:3.0.0'

第二步:讲解根据生命周期进行取消和注册订阅者

    例如:        @Override        public void onStart() {            super.onStart();            EventBus.getDefault().register(this);        }        @Override        public void onStop() {            super.onStop();            EventBus.getDefault().unregister(this);        }

第三步:定义事件

public static class MessageEvent { /* Additional fields if needed */ }

第四步:发布事件(两种方法)

需要在你需要获取数据的地方发布事件:普通事件:EventBus.getDefault().post(new MessageEvent());粘性事件:EventBus.getDefault().postSticky(new MessageEvent("test"));

第五步:接收事件(四种)

注意:在注解的里面是含有优先级的,在注解上加上 priority = 优先级数(int值)下面是普通的事件接收,要想接收粘性事件,添加一个参数 @Subscribe(threadMode = ThreadMode.MAIN, sticky = true),根据不同的注解可以分别接收粘性事件,默认就是非粘性事件, 如果是粘性事件,只需要在事件的注解上面加上。(1)那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为PostThread的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。默认是这个线程@Subscribe(threadMode = ThreadMode.POSTING, priority = 1)public void onMessageEventPostThread(MessageEvent messageEvent) {      Log.e("PostThread", Thread.currentThread().getName());}(2)那么不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中执行。该方法可以用来更新UI,但是不能处理耗时操作。@Subscribe(threadMode = ThreadMode.MAIN, priority = 2)public void onMessageEventMainThread(MessageEvent messageEvent) {      Log.e("MainThread", Thread.currentThread().getName());}(3)那么如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件 处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。@Subscribe(threadMode = ThreadMode.BACKGROUND, priority = 3)public void onMessageEventBackgroundThread(MessageEvent messageEvent) {     Log.e("BackgroundThread", Thread.currentThread().getName());}(4)那么无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行。同样,此事件处理函数中禁止进行UI更新操作。@Subscribe(threadMode = ThreadMode.ASYNC, priority = 4)public void onMessageEventAsync(MessageEvent messageEvent) {     Log.e("Async", Thread.currentThread().getName());}
0 0