EventBus 3.0的简单使用

EventBus的作用:

当我们进行项目开发的时候,往往是需要应用程序的各组件、组件与后台线程间进行通信,比如在子线程中进行请求数据,当数据请求完毕后通过Handler或者是广播通知UI,而两个Fragment之家可以通过Listener进行通信等等。当我们的项目越来越复杂,使用Intent、Handler、Broadcast进行模块间通信、模块与后台线程进行通信时,代码量大,而且高度耦合。

EventBus的三要素:

1.Event 事件。它可以是任意类型。

2.Subscriber 事件订阅者。在EventBus3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING。

3.Publisher 事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。


EventBus的四种线程模型:

1.POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
2.MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
3.BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
4.ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。

EvebtBus的基本使用:

举个例子,我需要在一个Activity里注册EventBus事件,然后定义接收方法,这跟Android里的广播机制很像,你需要首先注册广播,然后需要编写内部类,实现接收广播,然后操作UI。所以,在EventBus中,你同样得这么做。

1.自定义一个事件类

public class MessageEvent {
    private String msg;

    public MessageEvent(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

2.订阅事件

订阅者需要定义事件处理方法(也称为订阅者方法)。当发布对应类型的事件时,该方法将被调用。EventBus 3使用 @Subscribe 注解来定义订阅者方法。方法名可以是任意合法的方法名,参数类型为订阅事件的类型。

例如:

@Subscribe(threadMode = ThreadMode.MAIN)
public void showMsg(MessageEvent event){
    ...
}

3.注册事件

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    //注册EventBus
    EventBus.getDefault().register(this);
}

4.解除注册

@Override
protected void onDestroy() {
    super.onDestroy();
    //解除订阅EventBus
    EventBus.getDefault().unregister(this);}

举个例子:

在MianActivity启动SecondActivity,后点击按钮关闭SecondActivity并回调消息到MianActivity,MainActivity接收显示。

事件类型:

public class MessageEvent {
    private String msg;

    public MessageEvent(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

我的MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView content_tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.main_tv).setOnClickListener(this);
        content_tv= (TextView) findViewById(R.id.content_tv);
        //注册EventBus
        EventBus.getDefault().register(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case  R.id.main_tv:
                Intent intent =new Intent(this,SecondActivity.class);
                startActivity(intent);
                break;
        }
    }

    /**
     * 订阅者需要定义事件处理方法(也称为订阅者方法)。
     * 当发布对应类型的事件时,该方法将被调用。
     * EventBus 3使用 @Subscribe 注解来定义订阅者方法。
     * 方法名可以是任意合法的方法名,参数类型为订阅事件的类型。
     * */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void showMsg(MessageEvent event){
        content_tv.setText(event.getMsg());
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除订阅EventBus
        EventBus.getDefault().unregister(this);
    }
}

我的SecondActivity:

public class SecondActivity extends Activity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        findViewById(R.id.second_tv).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case  R.id.second_tv:
                //发送消息
                EventBus.getDefault().post(new MessageEvent("你们都是大大大帅哥"));
                finish();
                break;
        }
    }
}

最后效果图:

EventBus 3.0的简单使用