EventBus简单使用

1.什么是Event Bus?

Event Bus是针一款对Android的发布/订阅事件总线。它可以让我们很轻松的实现在Android各个组件之间传递消息,并且代码的可读性更好,耦合度更低。



2.Event Bus的优点缺点和对它的了解?


在3.0之前,EventBus还没有使用注解方式。消息处理的方法也只能限定于onEvent、
onEventMainThread、onEventBackgroundThread和onEventAsync,
分别代表四种线程模型。而在3.0之后,消息处理的方法可以随便取名,但是需要添加
一个注解@Subscribe,并且要指定线程模型(默认为PostThread),四种线程模型,下面会讲到。
注意,事件处理函数的访问权限必须为public,否则会报异常
优点:代码简洁,有效的降低了订阅者和发布者之间的耦合度.
缺点:
1.大量的滥用,导致逻辑分散,出现问题后很难定位.
2.没办法实现强类型.
3.代码可读性不好,IDE无法识别这些协议,对IDE不友好.


3.简单使用

第一步:导入依赖包(可以自行查找:我这是studio 3.0.1的依赖)

compile 'org.greenrobot:eventbus:3.1.1'


第二步:


(1)首先需要定义一个消息类,该类可以不继承任何基类也不需要实现任何接口。如:

public class MessageEvent {
    ......
}

(2)在需要订阅事件的地方注册事件

EventBus.getDefault().register(this);

(3)产生事件,即发送消息

EventBus.getDefault().post(messageEvent);

(4)处理消息

@Subscribe(threadMode = ThreadMode.PostThread)
public void XXX(MessageEvent messageEvent) {
    ...
}

代码操作



根据文章最前面所讲的EventBus使用步骤,首先我们需要定义一个消息事件类:

我们通过生命构造方法在里面传我们想要的值(需要什么字段自己定义)
public class MessageEvent {

    private String message;

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

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

在ActivityA界面中我们首先需要注册订阅事件:(在哪里注册消息就传递到哪里)

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

然后在onDestory()方法中取消订阅:(可以理解为解绑方法)

@Override
protected void onDestroy() {
    super.onDestroy();
    //取消事件注册
    EventBus.getDefault().unregister(this);
}

当然还要定义一个消息处理的方法:(用于就收消息)

//@Subscribe(threadMode = ThreadMode.MainThread)无论事件从哪个线程发送过来
//,最后都会在主线程执行,该方法可以用来更新UI,不能做耗时操作,

@Subscribe(threadMode = ThreadMode.MainThread)
public void onShowMessageEvent(MessageEvent messageEvent) {
    mMessageView.setText("Message from SecondActivity:" + messageEvent.getMessage());
}

必须知道:
1.PostThread:如果使用事件处理函数指定了线程模型为PostThread,那么该事件在哪个线程发布出来的,

事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程
模型为PostThread的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚
至有可能会引起ANR.
2.MainThread: 如果使用事件处理函数指定了线程模型为MainThread,那么不论事件是在哪个线程中发布出来的,
该事件处理函数都会在UI线程中执行.该方法可以用来更新UI但是不能做耗时操作.


3.BackGroundThread:如果使用事件处理函数指定了线程模型为BackgroundThread,那么如果事件是在UI线程中

发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处

理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。


4.Async:如果使用事件处理函数指定了线程模型为Async,那么无论事件在哪个线程发布,该事件处理函数都会在

新建的子线程中执行。同样,此事件处理函数中禁止进行UI更新操作

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