#工作需要#
首先不多废话,咱们先来给依赖导入自己的程序中
注:是build.gradle中哈,正好说到了就区别一下吧,下边的api的意思就是全包都可以使用,前缀implementation是只能在这个包下去使用此依赖(自己的理解)
1.0 依赖:
api 'org.greenrobot:eventbus:3.2.0'
1.1 创建一个实体类用来存放我们的message
public class EBMessage {
private String message;
public String getMessage() {
return message;
}
public EBMessage(String message) {
this.message = message;
}
public EBMessage() {
}
}
1.2 发送消息
注:一般都是在点击事件中去发送,如果你要发送消息的页面还没有启动,那你的消息是接收不到的,这样的话就要考虑使用其他方法实现了
EventBus.getDefault().post(new EBMessage("消息内容"));
1.2.1 需要去在onCreate中或者onStart中注册EventBus,如果有的话就不会多次注册,避免抛出异常
注:在我们发送消息的页面不需要注册,只是接收消息的页面去注册
if (!EventBus.getDefault().isRegistered(this)) {//加上判断
EventBus.getDefault().register(this);
}
1.2.2 有注册肯定需要去反注册,那么要去onDestroy中解(反)注册,多去进行判断,为了不去给我们抛出异常
if (EventBus.getDefault().isRegistered(this)) {//加上判断
EventBus.getDefault().unregister(this);//反注册代码
}
1.3 需要在我们需要获取message的页面去接收
@Subscribe(threadMode = ThreadMode.MAIN,priority = 1,sticky = true)
public void onEvent(EBMessage event){
Log.i("onEvent","----onEvent收到了消息:"+event.getMessage());
//拿到了event之后直接去做逻辑
//下边是一个案例,判断你发送过来的是哪一个就去执行逻辑
if (event.getMessage().equals("gone")){
tv_test.setVisibility(View.GONE);
}else if(event.getMessage().equals("visible")){
tv_test.setVisibility(View.VISIBLE);
}
}
下边的四种方法我们在接收的页面中去自己实现其中一种就好了,但是一定要有@Subscribe注解,如果没有会抛出异常,然后我们在方法中去接收判断
注:黏性事件的话我们就要去使用最后一个接收的事件了我们还需要去改发送方的发送方式 如下(处理黏性事件):
EventBus.getDefault().postSticky(new EBMessage("消息内容"));
@Subscribe
public void onEvent(EBMessage event) {
//逻辑处理
}
@Subscribe
public void onEventAsync(EBMessage event) {
//逻辑处理
}
@Subscribe
public void onEventBackgroundThread(EBMessage event) {
//逻辑处理
}
@Subscribe(threadMode = ThreadMode.MAIN,priority = 1,sticky = true)
public void onEventMainThread(EBMessage event) {
//逻辑处理
}
1.3.1 肯定有小伙伴疑问,为什么最后一个的注解需要这么长呢?下边为大家解答:
1.4 四种线程模型
EventBus3.0中有四种线程模型:
POSTING:默认,表示事件处理函数的线程跟发布事件的线程在同一个线程。
MAIN:表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
BACKGROUND:表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
ASYNC:表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
1.5 优先级
priority
。它用来指定订阅方法的优先级,是一个整数类型的值,默认是0,值越大表示优先级越大。在某个事件被发布出来的时候,优先级较高的订阅方法会首先接受到事件。
有兴趣的伙伴可以看看源码,里边也有Handler,就解决了为什么不能做耗时操作的疑问了。简单的使用就是这些啦,继续加油!努力赚钱,现实一点都是要生活的。
——文章出自一个程序员小白