EventBus
获取的时候需要调用EventBus.getDefault():静态方法来得到对象:如果非空直接返回,如果不空,创建对象后返回
注册EventBus:eventBus.register(当前Activity):使得当前activity成为一个订阅者
不可以重复注册(EventBusException):可以在注册的时候加一个判断,来判断是否已经注册
需要在当前activity中定义事件回调方法(定义为public,需要在类间访问):对这个方法使用注解来区分
发布的时候需要定义事件对象来发布对应的事件:setMsg();绑定事件(定义事件对象),post用于发送事件
取消注册:eventBus.unRegister();取消之后就不会再发送了
第二个activity
验证两个activity能不能收到,理论上可以收到,但需要保证activity没有被销毁
注册为订阅者
发布事件的时候有普通事件和粘性事件,此处用的是普通事件
定义事件回调方法(一定要有注解)
(需要从第一个activity中跳转到第二个activity来发送消息)
第一次交互的时候第一个activity发送消息第二个不会受到:因为第二个还没有被创建,但是第二个发送的时候第一个能收到(两个都被创建了),
再返回到第一个的时候,第一个再发送第二个还是收不到:从第二个返回到第一个页面的时候,第二个页面被销毁了
五种线程模式
发布和执行是否在一个线程中
- POSTING:订阅者在发布事件的同一个线程中调用,默认的一种线程模式,不能长时间
- MAIN:订阅者在主线程(UI)中调用,不能进行耗时操作,(不管是谁发布,都会在主线程中执行)
- MAIN_ORDERE:订阅者在Android主线程中排队等待被调用
- BACKGROUND:订阅者将在后台线程(不是UI线程)中调用,可以处理耗时任务,但是一般不会这样使用,因为会阻塞发布事件的线程
- ASYNC:订阅者方法在单独的线程中调用,始终独立于发布线程和主线程,适用于事件处理程序是耗时的操作,如网络访问
前三种不能用来执行耗时任务
使用:
@Subscribe(ThreadMode=ThreadMode.ASYNC)
粘性事件
//发布粘性事件
EventBus.getDefault().postSticky(new MessageEvent(“……"));
// 移除指定的粘性事件
removeStickyEvent(Object event);
// 移除所有的粘性事件
removeAllStickyEvents();
// 移除指定类型的粘性事件
removeStickyEvent(Class<T> eventType);
- 区别
普通事件:必须先注册才能收到
粘性事件:注册之后能收到注册之前发送的粘性事件 - 注册之后的订阅者可以两种事件都能收到