EventBus3.0介绍与正确使用

EventBus3.0介绍与正确使用

常规的事件传递

  • Intent意图,跳转+传参(局限性非常大)
  • Handler,通常用来更新主线程UI 泗洪不当容易内存泄漏
  • Interface接口,仅限于同一线程中数据交互
  • BroadCastReceiver,有序广播+无序广播
  • AIDL跨进程通信,代码阅读性不友好,维护成本偏高
  • 其他方式,比如本地存储。。。

什么是EventBus?

EventBus是一个Android优化的publish/subscribe消息事件总线简化了应用程序内各个组件间、组件与后台线程间的通信
如:Activites,Fragments,Threads,Services

使用场景

例子:

  • 比如网络请求,返回时通过Handler或者BroadCastBeceiver通知更新主线程UI
  • N个Fragment之间需要通过Listener(监听)通信
    这些需求都可以通过EventBus完成和实现

官方架构图

在这里插入图片描述

GitHub地址:

https://github.com/greenrobot/EventBus

导入EventBus库

build,gradle

implementation 'org.greenrobot:eventbus:3.2.0'

EventBus使用

EventBus 使用三步骤

注册/反注册 官方提供的方法,会进入反射里面

@Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }

其实我们实际开发中正确使用EvenBus的方法:
在app build,gradle 的dependencies模块中添加注解依赖库

annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'

在app build,gradle 的 defaultConfig模块添加

// 给注解处理器传参
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [ eventBusIndex : 'com.netease.eventbus.demo.MyEventBusIndex' ]
            }
        }

在自定义的Application中的onCreate方法中添加如下代码即可使用。

EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
  1. 定义事件
public static class MessageEvent { /* Additional fields if needed */ }

  1. 订阅事件(注解 + 方法指定参数)
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};

粘性事件
sticky = true @Subscribe注解中加入:sticky = true
作用:延时消费或者未初始化

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)  
public void onMessageEvent(UserInfo user) {/* Do something */};
  1. 发送事件(发送消息)
EventBus.getDefault().post(new MessageEvent());

EventBus订阅方法执行优先级

@Subscribe(threadMode = ThreadMode.MAIN, priority = 1)  
public void onMessageEvent(UserInfo user) {
	//消费消息/事件
	tv.setText(User.toString)
	Log.e("mile","onMessageEvent");
};

// priority优先级越高,数值越大。默认都为0
@Subscribe(threadMode = ThreadMode.MAIN, priority = 10)  
public void onMessageEvent(UserInfo user) {
	//消费消息/事件
	tv.setText(User.toString)
	Log.e("mile","onMessageEvent");
};

如果两个订阅方法可以同时接收,priority数值越大,优先级越高。默认为0

猜你喜欢

转载自blog.csdn.net/yanwenyuan0304/article/details/106232315