【Android 进阶】EventBus---超级方便的工具

来源:互联网 发布:安卓手机应用 知乎 编辑:程序博客网 时间:2024/05/21 11:05

EventBus是什么?有什么用处?

EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅。以及将发送者和接收者解耦。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

开源地址

https://github.com/greenrobot/EventBus

一般使用步骤

1)添加jar包到libs文件夹下

这里写图片描述

2)注册(在需要接受到数据的Activity)

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

3)解注册(在需要接受到数据的Activity)

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

4)构造 发送消息 类(另外建立一个class)

public class MessageEvent {
public String name;
public String password;
public MessageEvent(String name, String password) {
this.name = name;
this.password = password;
}
}

5)发布消息(不需要在该调用所在的Activity里注册和解注册)

EventBus.getDefault().post(new MessageEvent(“veyron”,”123”));

6)接收信息类(当然是在你注册和解注册的那个Activity里面)

@Subscribe(threadMode = ThreadMode.MAIN)
public void messageEventBus(MessageEvent event){
tv_result.setText(“name:”+event.name+” passwrod:”+event.password);
}

其中:

接收方法类型:
ThreadMode.MAIN 表示这个方法在主线程中执行,就是事件的处理会在UI线程中执行。事件处理时间不能太长,这个不用说的,长了会ANR的。

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

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

ThreadMode.POSTING: 事件的处理和事件的发送在相同的进程,所以事件处理时间不应太长,不然影响事件的发送线程,而这个线程可能是UI线程。

注意:

假设ActivityA想通过EventBus向ActivityB发送数据。准备好发送消息类,在ActivityB里面分别注册和解注册,然后准备接收消息类。这时候从
ActivityA点击按钮开启ActivityB,发现接收消息类是接收不到数据的。
原因就是一般事件必须先注册,再发送数据。也就是说ActivityB必须先开启,所以问题就是:通过ActivityA 开启ActivityB(本身没有先开启,所以接收不到数据)。
这并不是我们想要的结果对吧?那么看下面的黏性事件。

黏性事件以及使用步骤

之前说的使用方法, 都是需要先注册(register), 再post,才能接受到事件;
如果你使用postSticky发送事件, 那么可以不需要先注册, 也能发送信息,但是最后还是需要注册了才可以接收到数据。这种方式也是符合我们大众的需求以及思维习惯。

1)构造 发送信息 类

public class StickyEvent {
public String msg;
public StickyEvent(String msg) {
this.msg = msg;
}
}

2)发布黏性消息类

EventBus.getDefault().postSticky(new StickyEvent(“这个是粘性事件”));

3)接收消息类

//注意,和之前的方法一样,只是多了一个 sticky = true 的属性.
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onEvent(StickyEvent event){
tv_c_result.setText(event.msg);
}

4)注册:才真正接收信息,或者说开启接收权限,接收信息代码才会执行。

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

5)解注册

EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(Activity.class);

索引加速:

3.0 后引入了索引加速(默认不开启)的功能,即通过 apt 编译插件的方式,在代码编译的时候对注解进行索引,避免了以往通过反射造成的性能损耗。
如何使用可以参考官方文档

Proguard处理:

#EventBus -keepclassmembers class ** {    public void onEvent*(**);    void onEvent*(**); }
1 0
原创粉丝点击