EventBus使用说明

EventBus因为其使用方便简单,受到了很多Android开发的喜爱。我将从这篇博客开始,学习EventBus。在学习EventBus的原理之前,我先记录一下EventBus的使用方法。

EventBus类似Android中的广播,是标准的观察者模式。因此,我们在使用EventBus时,只需要关注三件事。制作一个消息,注册一个监听者,发送一个消息。

1.制作一个消息:

public class EventBusBaseMsg  {
    public EventBusBaseMsg(String name){
        this.name = name;
    }
    public String name;
}

 

2.注册一个监听者:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mStartActivityBtn = (TextView) findViewById(R.id.start_activity_btn);
    mStartActivityBtn.setOnClickListener(this);
    EventBus.getDefault().register(this);
 
}
 
@Subscribe(threadMode = ThreadMode.MAIN , priority = 1)
public void onMsg1(EventBusBaseMsg event) {
    Log.d("tag", this.getClass().getSimpleName() + " receive the msg1 = " + event);
}
 
@Subscribe(threadMode = ThreadMode.MAIN  , priority = 1)
public void onMsg2(EventBusBaseMsg event) {
    Log.d("tag", this.getClass().getSimpleName() + " receive the msg2 = " + event);
}

 

 

通过Subscribe的注解,我们将某个方法定义为监听者,在Subscribe中,我们可以设置监听者的一些属性,这个在后面记录。

3.发送消息:

 
 EventBus.getDefault().post(new EventBusBaseMsg("101zg"));

 

这三步完成,我们就可以完成一次消息在总线上的传递。

Subscribe:

在写监听方法时,我们需要为该方法加上@Subscribe注解。这个注解提供一些可以设置的属性。

 threadMode:

 这个属性选择监听方法,在得到消息后,在哪里来处理这个消息。

 POSTING:事件的处理在和事件的发送在相同的线程,所以事件处理时间不应太长,不然影响事件的发送线程。

 MAIN: 事件的处理会在UI线程中执行。事件处理时间不能太长,长了会出现臭名远之的ANR。

 BACKGROUND:事件的处理会在一个后台线程中执行。虽然名字是BackgroundThread,事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接在当前后台线程执行事件;如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。

 ASYNC:事件处理会在单独的线程中执行,主要用于在后台线程中执行耗时操作,每个事件会开启一个线程,但最好限制线程的数目。

 priority:

 这个属性,用来确定监听的优先级。priority值比较高的监听方法,会先进行处理。如果优先级相同,则先注册的会先接收到消息并进行处理。

 sticky:

 粘性事件,类似于粘性广播。可以先发消息,再注册监听,类似于Android中的粘性广播。Google建议谨慎使用粘性广播。因为它会带来内存泄露。

陷阱:

以上的使用方法,可以看到效果,但是留下了一些隐患。

1.通过EventBus.getDefault().register(this);我们可以看到,EventBus包含一个单例模式,而在注册的时候,这个单例又获得了Activity的引用——this。如果我们不进行正确地注销,不仅Activity不会被释放,它的监听函数也会一起响应。

因此,我们需要根据自己的需要,在合适的地方进行注销,切断EventBus和监听者的引用的关联。

 EventBus.getDefault().unregister(this);

2.EventBus的注册监听函数的机制,采用的方法是反射。反射的缺点是:效率低和不能混淆。这也是EventBus的缺点。所以,EventBus只适合小规模的,在组件间进行通信。

EventBus的基本使用就记录至此,下一篇开始探究它的原理。

Done~

posted on 2016-04-16 00:35  Fishbonell  阅读(255)  评论(0编辑  收藏  举报