EventBus 的简单使用

本篇文章主要介绍以几下个知识点:

  • 使用 EventBus 的步骤
  • 一个简单的demo
EventBus 的简单使用_第1张图片
图片来源于网络

1. EventBus 简介

**EventBus ** 是一个基于观察者模式的 publisher/subscriber 事件总线。通过极少的代码实现模块间的通信,使用方便,性能高,降低耦合。官方架构图如下:

EventBus 的简单使用_第2张图片
EventBus-Publish-Subscribe

EventBus 的项目主页地址:
  https://github.com/greenrobot/EventBus
  EventBus 的官方介绍:
  http://greenrobot.org/eventbus/

2. 使用 EventBus 的步骤

首先在项目中添加 EventBus 依赖:

dependencies {
  compile 'org.greenrobot:eventbus:3.0.0'
}

EventBus 的基本用法很简单,有如下几个步骤:

步骤 1:定义事件(Define events)

定义事件类似定义一个实体类,如定义两个事件如下:

/**
 * Function:定义消息事件
 * Author:Wonderful on 2017/3/11 09:26
 */

public class MessageEvent {

    public final String msg;

    public MessageEvent(String msg) {
        this.msg = msg;
    }
}
/**
 * Function:定义其他事件
 * Author:Wonderful on 2017/3/11 09:41
 */

public class SomeOtherEvent {

    public final String something;

    public SomeOtherEvent(String something) {
        this.something = something;
    }
}

步骤 2:准备订阅者(Prepare subscribers)

订阅者实现事件处理方法,这个方法会在事件提交的时候被调用。需使用@Subscribe注解定义,如下:

   /**
     * This method will be called when a MessageEvent is posted (in the UI thread for Toast)
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event){
        Log.i("onMessageEvent-------->",event.msg);
        ToastUtils.show(event.msg);//弹吐司显示信息
    }

    /**
     * This method will be called when a SomeOtherEvent is posted
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void handleSomethingElse(SomeOtherEvent event){
        Log.i("handleSomethingElse--->",event.something);
        ToastUtils.show(event.something);
    }

值得注意的是,注册监听模块必须有一个标注Subscribe注解方法,否则在register时会抛出异常。注解的几个参数如下(可以点击相关链接查看官方介绍):

  • threadMode:回调所在的线程
     ThreadMode: POSTING(默认使用)
     ThreadMode: MAIN(UI线程)
     ThreadMode: BACKGROUND
     ThreadMode: ASYNC
  • priority: 优先级(默认是 0)
  • sticky: 是否接收黏性事件

准备完订阅者别忘了添加注册和注销订阅者,如下:

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

值得注意的是:实际使用中,register、unregister 通常与 Activity、Fragment 的生命周期相关,比如当你在第一个界面准备好订阅者,点击某个控件跳转到第二个界面,在第二个界面点击某个控件提交事件并关闭第二个界面,此时要想在第一个界面的订阅者接受到事件做出响应,那么上面在 onStart() 中注册就可能无效了,此时应该在onCreate() 方法中注册。我会选择在 onCreate() 和 onDestroy() 中分别进行注册和注销:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_bus);

        EventBus.getDefault().register(this);
    }

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

步骤 3:提交事件( Post events)

提交事件很简单,在代码中任意位置都可以提交事件。如下:

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

3. 一个简单的Demo

利用 EventBus 实现点击按钮提交事件,订阅者接收到事件后弹出吐司提示事件内容,以及在第二个activity 点击按钮提交事件并且关闭后,在第一个activity中接收到第二个activity提交的事件并作出响应,如下:

EventBus 的简单使用_第3张图片
eventbus的简单demo

首先定义事件:

/**
 * Function:定义消息事件
 * Author:Wonderful on 2017/3/11 09:26
 */
public class MessageEvent {

    public final String msg;

    public MessageEvent(String msg) {
        this.msg = msg;
    }
}
/**
 * Function:定义其他事件
 * Author:Wonderful on 2017/3/11 09:41
 */
public class SomeOtherEvent {

    public final String something;

    public SomeOtherEvent(String something) {
        this.something = something;
    }
}

接着准备订阅者以及提交事件:

public class EventBusActivity extends AppCompatActivity {

    TextView tv_show;//显示内容

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_bus);

        EventBus.getDefault().register(this);

        findViewById(R.id.post_message_event).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 提交事件
                EventBus.getDefault().post(new MessageEvent("哈,这是EventBusActivity提交的事件"));
            }
        });

        findViewById(R.id.to_other_activity).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 跳转到 SomeOtherActivity
                IntentUtils.to(EventBusActivity.this,SomeOtherActivity.class);
            }
        });

        tv_show = (TextView) findViewById(R.id.tv_show);
    }

    /**
     * This method will be called when a MessageEvent is posted (in the UI thread for Toast)
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event){
        //弹吐司显示EventBusActivity中提交事件的信息
        ToastUtils.show(event.msg);
    }

    /**
     * This method will be called when a SomeOtherEvent is posted
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void handleSomethingElse(SomeOtherEvent event){
        //设置接收SomeOtherActivity中提交事件的内容
        tv_show.setText(event.something);
    }

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }
}
public class SomeOtherActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_some_other);

        findViewById(R.id.post_some_other_event).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new SomeOtherEvent("这是SomeOtherActivity提交的事件红红火火"));
                finish();
            }
        });
    }
}

好了,本篇文章就介绍到这,只是简单的基本使用,想要了解更多去看看官方介绍,相信你收获更大。

你可能感兴趣的:(EventBus 的简单使用)