EventBus用来做什么:
EventBus是使用发布者/订阅者模式进行松散耦合的Android开源库。 EventBus使得项目中通信能够仅使用几行代码来解耦类,简化代码,消除依赖关系,加快应用程序开发速度。
注意:
①:EventBus的事件分发只能在本应用中起作用,它不像广播那样,一发送,只要在手机中注册的都会接受。
②:由于API的改动,会导致EventBus3和之前使用老版本的EventBus不兼容,因为之前版本(EventBus 2.x),在注册完事件之后,会要求写相应
onEvent()方法,包括onEvent() 事件在哪个线程发出来,OnEvent()就会在哪个线程运行onEventAsync() 无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync().onEventBackground() 如果事件是在UI线程中发布出来的,那么oEB()就会在子线程中运行,如果本来就是子线程中发布的,那么oEB()直接在该子线程中执行。
onEventMainThread() 如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
分别对应
@Subscribe@Subscribe(threadMode = ThreadMode.ASYNC)@Subscribe(threadMode = ThreadMode.BACKGROUND)@Subscribe(threadMode = ThreadMode.MAIN)
EventBus 3中在未声明threadMode时,默认的线程模式为ThreadMode.POSTING。
③:在EventBus3中,如果在@Subscrible标注的方法中,如果程序出错,不会立即使程序crash,而是由EventBus拦截异常,并打印错误日志。用户可以通过EventBusBuilder来配置获取EventBus实例后的对象,来决定在处理event时是否需要抛出异常信息:
eventBus = EventBus.builder().sendNoSubscriberEvent(false)
.sendSubscriberExceptionEvent(false).throwSubscriberException(BuildConfig.DEBUG) //只有在debug模式下,会抛出错误异常.build();
添加依赖库:
compile 'org.greenrobot:eventbus:3.0.0'
1:常用方法(注册的对象obj可以是:Activity,Fragment,Service,Threads )
getDefault() //初始化一个单例的EventBus实例
register(Object subscriber) //注册接收事件的对象
unregister(Object subscriber) //取消注册接收事件的对象
isRegistered(Object subscriber) //判断此对象是否订阅了事件总站
post(Object event) //发送一个事件
postSticky(Object event) //发送一个事件,并将最后一次的事件缓存起来,下次如果有注册,并且sticky为true直接将缓存的事件发送给他
@Subscribe(threadMode = ThreadMode.POSTING, sticky = true,priority = 1)
用来取代2.x中定义事件接收的方法 ,这样方法名可以是任意的,接收事件的类型由@Subscribe来定义
ThreadMode:决定订阅函数在哪个线程执行:POSTING,MAIN,BACKGROUND,ASYNC
stick: 默认为false,如果为true,当通过postSticky发送一个事件时,这个类型的事件的最后一次事件会被缓存起来,当有订阅者注册时,会把之前缓存起来的这个事件直接发送给它。使用在比如事件发送者先启动了,订阅者还没启动的情况。
priority:默认值为0,定义收到事件的优先级.
2:EventBus 2.x使用:
①:定义事件
class ResultEvent{ public String message; public ResultEvent(String msg){ message = msg; } }
②:注册 和 取消注册 (这个没啥说的直接调用 register和unregister就ok)
③:用相应的方式去接收事件
public void onEvent(ResultEvent event){ Toast.make(mContext,event.messgee,Toast.LENGTH_LONG).show(); }
④:发送事件
EventBus.getDefault().post(new ResultEvent("hello EventBus"));
3:EventBus 3.0的使用
①,②,④都一样
③:定义接收事件的方法
@Subscribe(threadMode = ThreadMode.Async, sticky = true, priority = 1) public void onAsync(ResultEvent event) { Log.e("TAG", "Async: " + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.BackgroundThread) public void onBackgroundThread(ResultEvent event) { Log.e("TAG", "BackgroundThread: " + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.MainThread) public void onMainThread(ResultEvent event) { Log.e("TAG", "MainThread: " + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.PostThread) public void onPostThread(ResultEvent event) { Log.e("TAG", "PostThread: " + Thread.currentThread().getName()); }
测试:在主线程中发送:
EventBus.getDefault().post(new ResultEvent("Hello EventBus3.0"));
执行结果:
Async: pool-1-thread-1MainThread: mainPostThread: mainBackgroundThread: pool-1-thread-2
测试:在子线程中发送:
new Thread(){ public void run(){ EventBus.getDefault().post(new ResultEvent("Hello EventBus3.0")); } }.start();
执行结果:
BackgroundThread: Thread-450PostThread: Thread-450Async: pool-1-thread-1MainThread: main