EventBus 简单使用(一)

作者: d74f37143a31 | 来源:发表于2018-12-05 22:46 被阅读14次

    好用,但是要用好不容易!

    EventBus 介绍

    官网地址:http://greenrobot.org/eventbus/

    使用介绍地址:http://greenrobot.org/eventbus/documentation/

    EventBus 使用场景

    EventBus是一个AndroidJava的开源库,使用发布者/订阅者模式进行松散耦合。
    事件发布订阅 就像是生活中的:你订阅了一家杂志的书刊,每到固定的时间,杂志社就会把书送给你。
    Android中对应的就是,我在某个页面需要得到某个数据或者某个对象,那么我在当前页面先订阅,那么在拥有该数据或者对象的操作中发送事件。我就能在对应的已经订阅了该数据或者该对象的页面得到发送的事件。

    • 替换Handler刷新UI问题
    • Activity页面跳转数据传递
    • Fagment页面切换数据刷新问题
    • 数据该表通知页面及时刷新
    • 等等...

    使用

    第一步:添加依赖

    compile 'org.greenrobot:eventbus:3.1.1'

    第二步:定义Java对象

    public class MessageEvent {
     
        public final String message;
     
        public MessageEvent(String message) {
            this.message = message;
        }
    }
    

    第三步:准备订阅者

    Activity或者Fragment中的onResume()onPause()中注册,再定义一个方法用来接受事件。

    @Override
    public void onResume() {
        super.onResume();
        EventBus.getDefault().register(this);
    }
     
    @Override
    public void onPause() {
        super.onPause();
        EventBus.getDefault().unregister(this);
    }
    
    /**
    *  下面是两种方式接收事件
    *  第一个是:声明了在主线程中接收,可以进行 UI 相关的操作
    *  第二个是:没有声明在主线程中接收,刷新 UI 可能会出现问题
    */
    
    // 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(getActivity(), event.message, Toast.LENGTH_SHORT).show();
    }
     
    // This method will be called when a SomeOtherEvent is posted
    @Subscribe
    public void handleSomethingElse(SomeOtherEvent event) {
        doSomethingWith(event);
    
    

    第四步:发送事件

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

    以上就完成了 EventBus 的简单使用~

    上面说到了在处理事件时可以指定线程,它有以下四种线程模式:

    • ThreadMode: POSTING
      订阅者将在发布事件的同一线程中调用。这是默认的模式,也是 EventBus 推荐使用的模式,因为它开销最小。使用该模式应该要快速响应,避免线程阻塞。使用例子如下:
    // 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: MAIN_ORDERED
      UI线程中调用,并且事件是有顺序的,按顺序返回。使用该模式应该要快速响应,避免线程阻塞。使用例子如下:
    // Called in Android UI's main thread
    @Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
    public void onMessage(MessageEvent event) {
        textField.setText(event.message);
    }
    
    • ThreadMode: BACKGROUND
      订阅者将在后台线程中调用。如果发布线程不是主线程,则将在发布线程中直接调用事件处理程序方法;如果发布线程是主线程,则EventBus使用单个后台线程,该线程将按顺序传递其所有事件。使用此模式的事件处理程序应快速返回以避免阻塞后台线程
    // Called in the background thread
    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void onMessage(MessageEvent event){
        saveToDisk(event.message);
    }
    
    • ThreadMode: ASYNC
      事件处理程序方法在单独的线程中调用,使用此模式的事件处理程序应快速返回以避免阻塞后台线程。
    // Called in a separate thread
    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void onMessage(MessageEvent event){
        backend.send(event.message);
    }
    

    相关文章

      网友评论

        本文标题:EventBus 简单使用(一)

        本文链接:https://www.haomeiwen.com/subject/owhgcqtx.html