一开始只是在一些博客上闪过看到过EventBus,直到最近才使用到EventBus,感觉很好用,很简单,所以我决定来会会这位大哥,这里有:EventBus源码地址。
1.首先我们先来了解一下这个EventBus到底是什么?
答:EventBus是一个Android事件发布和订阅的框架,通过解耦发布者和订阅者来简化Android事件传递。
2.EventBus是干嘛用的?
事件传递既可以用于Android四大组件间通信,也可以用于异步线程和主线程通信等,传统的事件传递方式有:Handler,接口回调,BroadcastReceiver,而EventBus就是 用来传递事件的,相对于传统的方式,它代码简洁,使用简单,并将事件发布和订阅充分解耦。
那我们该怎么去使用它呢(基本用法)?
例如在两个activity操作(FirstActivity,SecondActivity)
添加依赖:
//在app下的build.gradle中添加下面的依赖compile 'org.greenrobot:eventbus:3.0.0'
(在FirstActivity)注册订阅事件:
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
(在FirstActivity)取消注册订阅事件:
@Override
protected void onDestroy(){
super.onDestroy();
EventBus.getDefault().unregister(this);
}
(在SecondActivity)发布事件:
EventBus.getDefault().post(Object obj);
(在FirstActivity)订阅事件:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(Object obj){
//在这里进行逻辑操作
}
看吧,使用起来还是挺简单的,订阅者真正需要处理逻辑的就是在有注解@subscribe的方法onEvent(Object obj)中去按照我们自己的需求去处理,当然这里方法名不一定是onEvent了,我是受2.4版本影响,习惯了把方法名写成onEvent,在3.0版本中可以随意写,但是参数的class类型必须要跟发布者post的参数的class类型一致。
线程模式:
上面说过,只有使用注解@Subscribe(threadMode = ThreadMode.MAIN)标明的方法才是订阅者需要处理逻辑的地方。那这个threadMode是什么呢?它其实是指定订阅者处理事件的线程,EventBus总共有四种线程模式,分别是:
ThreadMode.MAIN:(主线程)表示无论事件是在哪个线程发布出来的,该事件订阅方法onEvent都会在UI线程中执行,这个在Android中是非常有用的,因为在Android中只能在UI线程中更新UI,所有在此模式下的方法是不能执行耗时操作的。
ThreadMode.POSTING:表示事件发布在哪个线程,事件订阅函数onEvent(就会在那个线程执行,所以事件发布和订阅都是发生在同一个线程的,当指定这个线程模式的时候,在onEvent(()方法中不能执行耗时操作,如果执行耗时操作,容易导致事件分发延迟。
ThreadMode.BACKGROUND(不管怎样都会在子线程里执行):表示如果事件在UI线程中发布出来的,那么订阅函数onEvent就会在子线程中运行,如果事件本来就是在子线程中发布出来的,那么订阅函数直接在该子线程中执行。
ThreadMode.ASYNC:使用这个模式的订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程来执行订阅函数。
*******ASYNC相比前三者不同的地方是可以处理耗时的操作,其采用了线程池,且是一个异步执行的过程,即事件的订阅者可以立即得到执行。虽然BACKGROUND也采用了线程池,但它每次只能执行一个任务,就是不会异步执行。所以一般是更新UI的事件,就使用ThreadMode.MAIN,需要请求网络的事件就使用ThreadMode.AYSNC,。
网友评论