Android EventBus3.0 使用详解

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-1
MainThread: main
PostThread: main
BackgroundThread: pool-1-thread-2


测试:在子线程中发送:
new Thread(){
	public void run(){
		EventBus.getDefault().post(new ResultEvent("Hello EventBus3.0"));
	}
}.start();


执行结果:
BackgroundThread: Thread-450
PostThread: Thread-450
Async: pool-1-thread-1
MainThread: main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值