EventBus入门详解

来源:互联网 发布:网站seo诊断书 编辑:程序博客网 时间:2024/05/10 06:42

EventBus入门详解

                ONE Goal , ONE Passion !

EventBus 3.0简介 :


EventBus is an open-source library for Android using the publisher/subscriber pattern for loose coupling. EventBus enables central communication to decoupled classes with just a few lines of code – simplifying the code, removing dependencies, and speeding up app development.

EventBus 是一个开放的类库,使用发布/订阅者模式来降低耦合.它能用一行简单的代码实现解耦的类之间的交互.而且加大了app的开发速度

Your benefits using EventBus: It…

使用EventBus带来的优势:

  • simplifies the communication between components

让组件之间的交互更简单

  • decouples event senders and receivers

让事件发布者与事件接收者解耦

  • performs well with Activities, Fragments, and background threads

更好地处理 Activities, Fragments, and background threads.

  • avoids complex and error-prone dependencies and life cycle issues

避免复制和易错声明周期问题

  • is fast; specifically optimized for high performance

性能更加高效

  • is tiny (<50k jar)

jar包小于50K.


Add EventBus to your project 加入EventBus到你的项目中.

1.首先下载EventBus.jar包加入到项目

  • eventbus-3.0.0.jar

2.Define events 定义事件

Events are POJO (plain old Java object) without any specific requirements.

事件是一个没有任何特殊要求的java对象.

    /**     * ONE Goal,ONE Passion!     * Created by ${PK_Night} on 2016/12/14.     * comment:     */    public class MessageEvent {        public final String message;        public MessageEvent(String message) {            this.message = message;        }    }

3.Prepare subscribers 准备订阅者

Subscribers implement event handling methods (also called “subscriber methods”) that will be called when an event is posted. These are defined with the @Subscribe annotation.

订阅者实现事件处理方法(也叫订阅者方法),这些方法将被回调当事件被发送的时候.这里使用@Subscribe 注解来声明.

  // This method will be called when a MessageEvent is posted (in the UI thread for Toast)    @Subscribe(threadMode = ThreadMode.MAIN)    public void onMessageEvent(MessageEvent event) {        Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show();    }

4.Post events 发送事件

Post an event from any part of your code. All currently registered subscribers matching the event type will receive it.

从你的代码任何地方发送一个事件, 当前所有的订阅者,只要匹配事件类型都可以接收这个事件.

 EventBus.getDefault().post(new MessageEvent("Hello everyone!"));   

注:怎么匹配事件类型. 事件类型根据 post中的类型分类.

比如:
订阅者:

    // 订阅者一      public void onMessageEvent(事件类型一 event) {        Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show();    }       // 订阅者二      public void onMessageEvent(事件类型二 event) {        Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show();    }

发送者:

        // 发送事件时, 事件类型为: 事件类型一    EventBus.getDefault().post(new 事件类型一);

此时”订阅者一”可以接收到事件.发送者发送的为事件类型一.故订阅者一可以接收事件

5.简单的EventBus的ok了.快操练起来吧


等等啊….哥们,都是代码片段.我该把这些片段整那个地方啊!

MessageEvent类:

    /**     * ONE Goal,ONE Passion!     * Created by ${PK_Night} on 2016/12/14.     * comment:     */    public class MessageEvent {        public final String message;        public MessageEvent(String message) {            this.message = message;        }    }

Activity类:

    public class EventBusActivity extends AppCompatActivity {        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.activity_event_bus);        }        // 一个按钮点击事件. 来发送事件.        public void send(View view) {        // 发送事件,可以项目中的任何地方.这里为了演示方便就将订阅者和发送者写到了一个activity中.            EventBus.getDefault().post(new MessageEvent("Hello everyone!"));        }        @Override        public void onStart() {            super.onStart();            EventBus.getDefault().register(this);        }        @Override        public void onStop() {            EventBus.getDefault().unregister(this);            super.onStop();        }        // 这个方法将在UI线程中被回调        @Subscribe(threadMode = ThreadMode.MAIN)        public void onMessageEvent(MessageEvent event) {            Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show();        }        }

———–EventBus中四种线程模式——————

* ThreadMode: POSTING

默认线程,发送者在什么线程,”订阅者事件处理方法”就在什么线程,效率最高

// Called in the same thread (default)    // ThreadMode is optional here    @Subscribe(threadMode = ThreadMode.POSTING)    public void onMessage(MessageEvent event) {        log(event.message);    }

* ThreadMode: MAIN

“订阅者事件处理方法”将在UI线程中被回调.不要在此线程模式中做耗时操作

    // Called in Android UI's main thread    @Subscribe(threadMode = ThreadMode.MAIN)    public void onMessage(MessageEvent event) {    textField.setText(event.message);    }

* ThreadMode: BACKGROUND

“订阅者事件处理方法”将被回调在一个后开线程(子线程)中. 如果发送者不是一个主线程,那么处理方法将直接运行在当前线程. 如果发送者是一个主线程,那么EventBus将使用一个单一的后台线程,接收依次来接收所有的发送者发来的event.这种模式也不建议进行太多耗时操作,以防阻塞线程.

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

* ThreadMode: ASYNC

“订阅者事件处理方法”将被回调在一个单独的线程中.EventBus使用线程池来高效重复线程来处理异步事件.

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

————–Sticky Events 粘性事件———–

Some events carry information that is of interest after the event is posted. For example, an event signals that some initialization is complete. Or if you have some sensor or location data and you want to hold on the most recent values. Instead of implementing your own caching, you can use sticky events. So EventBus keeps the last sticky event of a certain type in memory. Then the sticky event can be delivered to subscribers or queried explicitly. Thus, you don’t need any special logic to consider already available data.

有一些事件:希望在事件发送后携带一些信息(数据). 例如:一个事件在初始化的时候已经完成发送. 或者如果你又一些重力,坐标数据,而且你想获取最近的数据,这时你就不需要做缓存,sticky event可以帮助到你. EventBus将会保存同一类型的最近的粘性事件.这些粘性事件将会交付给订阅者或者是明确请求粘性事件.换句话:使用已经存在的数据时,不需要考虑任何的逻辑.

1. a sticky event was posted some time ago:

某个时刻之前发送一个粘性事件

    // MessageEvent只是一个普通类    EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));

2.Now a new Activity gets started. During registration all sticky subscriber methods will immediately get the previously posted sticky event:

当一个activity被启动,订阅了粘性事件的订阅者将立刻得到之前发送的粘性事件.

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

3.Getting and Removing sticky Events manually:

手动获取,移除粘性事件

    获取粘性事件    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事件,同时返回MessageEvent事件.    MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);    if(stickyEvent != null) {        // Now do something with it .这里就可以用MessageEvent中的数据了.    }   

翻译至官方文档,有不足的地方还请建议,指教.

0 0