安卓开发|EventBus

EventBus是事件消息总站,实现组件与组件之间的通信 普通事件 1、在需要接收事件或者数据的类中注册EventBus.getDefault().register(ThirdActivity.this); 2、在需要接收事件或者数据的类中反注册 (在onDestroy) EventBus.getDefault().unregister(ThirdActivity.this); 3. 构造发送信息类public static class ClassEvent{public String data; ClassEvent( String data){ (String为传递的参数类型,根据自己需求定义) this.data=https://www.it610.com/article/data; }; 4. 发布消息 (参数中new 的是自定义的消息类) EventBus.getDefault().post(new ClassEvent(“某个地方发送过来的数据”)); 5. 在需要接收事件或者数据的类中定义方法接收消息@Subscribe(threadMode = MAIN)public void EventBus(ClassEvent event){tv_result.setText(event.jsonData); }粘性事件 EventBus 将最新的粘性事件保存在内存中,粘性事件可以被传递给订阅者 1.创建EventBus粘性事件消息类,设置属性:定义的是泛型String类型,(黄色涂抹区域)就只能传递String类型事件(根据自己传递的消息类型定义泛型) public class EventBusStickyMessage { public String Message ; public EventBusStickyMessage( String message) { Message = message; } }2. 发送黏性事件到接收页面,关键方法postSticky (new的类就是第一步定义的事件消息类)(此段代码是写在发送消息组件的页面的) EventBus . getDefault ().postSticky( new EventBusStickyMessage(" xxx " ));
3.接收黏性事件,在注解里多加了一个属性Sticky,设置为true是启动黏性事件 (此段代码写在接收消息的组件的页面,线程模式有四种,MAIN为UI线程,也就是主线程,-------------接收实际就是注册的一个过程)
@Subscribe (threadMode = ThreadMode. MAIN ,sticky = true ) public void ReceviceMessage(A(参数A第一步定义的消息类) a(a为消息类的对象){ //设置控件的内容,通过消息对象的.Message调用 txtShow2 .setText(eventBusStickyMessage. Message ); } // 一旦注册了 EventBus 就会接收到消息 if ( flag ){ //4. EventBus 注册广播 (), 参数是上下文 . 导入的 EventBus 请认准 org.greenrobot // 注意 : 有注册就必须有解注册 ( 一般在 OnDestroy 里执行解注册操作 ), 防止内存泄漏 , 注册一个界面只能注册一次 , 否则报错 EventBus. getDefault ().register( this ); // 更改标记 , 使其不会再进行注册 , 多次注册会报错 flag = false ; }
4. 在 onDestroy 里解除 EventBus 注册 , // 注意 : 这里比普通的解除注册还多一步 , 就是移除黏性事件 ( 是移除所有的还是移除一个 , 看需求 ) @Override protected void onDestroy() { // 移除所有的粘性事件 EventBus. getDefault ().removeAllStickyEvents(); // 解除注册 EventBus. getDefault ().unregister( this ); super .onDestroy(); }} 备注:线程的模式 ThreadMode.POSTING:默认使用该模式,表示该方法会在当前发布事件的线程执行 ThreadMode.MAIN:表示会在UI线程中执行 ThreadMode.BACKGROUND:若当前线程非UI线程则在当前线程中执行,否则加入后台任务队列,使用线程池调用 线程池 是一种多 线程 处理形式,处理过程中将任务添加到队列,然后在创建 线程 后自动启动这些任务 ThreadMode.ASYNC:加入后台任务队列,使用线程池调用 普通事件与粘性事件的区别 最大的特点就是添加了粘性事件(sticky),同时使用EventBus粘性事件的步骤和顺序也和普通使用有所不同。

    推荐阅读