一个Android事件发布/订阅轻量级框架
功能:通过解耦发布者和订阅者简化Android事件传递
EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数
在Fragment,Activity,Service线程之间传递数据,执行方法。
特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)。
提示:反射比注解更消耗资源且效率低
(一)关联EventBus框架
选中你所要关联的Modules,点击Dependencies,在点击+号,选择library dependency
在输入框中输入eventbus,选择greenrobot公司提供的,进行关联,新建一个Activity
(二)在OnCreate注册,在OnDestroy解除注册
提示参数是上下文(注意是:你的事件在哪接收,就在哪个类进行EventBus的注册和解除操作.)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1. 注册EventBus,参数是上下文. 注意:导入的EventBus请认准org.greenrobot.
//注意:有注册就必须有解注册(一般在OnDestroy里执行解注册操作),防止内存泄漏,注册一个界面只能注册一次,否则报错
//关于源码我只强调一点:EventBus拿到订阅方法,无法两种手段:1注解 2:反射
EventBus.getDefault().register(MainActivity.this);
}
@Override
protected void onDestroy() {
//这里解除注册
EventBus .getDefault().unregister(MainActivity.this);
super.onDestroy();
}
(三)创建EventBus消息类,设置属性。
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
(四)使用EventBus的Post方法发送事件
//4. 使用EventBus发送事件,使用Post方法,参数也必须是EventBus消息对且要和接收的保持一致
EventBus.getDefault().post(new EventBusMessage("这是来自第二个Activity发出的消息"));
(五)根据消息类,接收事件
接收消息,参数就是你定义的EventBus消息类,和发送消息类必须是同一个
加注解提示:在写接收消息的方法是,方法名可以自定义,权限必须是public,
参数必须是一个只要接收的参数类型是一致的,那么四个方法都可以接收到发送的信息 注释:给人看注解:给机器看
ThreadMode.MAIN表示这个方法在主线程中执行(适合做异步加载,可以将子线程加载到数据直接设置到UI界面里)
@Subscribe(threadMode = ThreadMode.MAIN)
public void MessageEventBus(EventBusMessage eventBusMessage){
//在TextView显示接收的消息,从这个类里拿属性.
tv_title.setText(eventBusMessage.Message);
Log.d("eventBusThread","ThreadMode.MAIN "+Thread.currentThread().getName());
}
//ThreadMode.POSTING表示该方法和消息发送方在同一个线程.
@Subscribe(threadMode = ThreadMode.POSTING)
public void MessageEventBus1(EventBusMessage eventBusMessage){
Log.d("eventBusThread","ThreadMode.POSTING "+Thread.currentThread().getName());
}
/*ThreadMode.ASYNC也表示在后台执行(也就是子线程执行),可以异步并发处理
(适用于多个线程任务处理,内部有线程池管理,比如请求网络时,用这个方法,他会自动创建线程去请求)
无论发布者是在子线程还是主线程,该方法都会创建一个子线程,在子线程执行.*/
@Subscribe(threadMode = ThreadMode.ASYNC)
public void MessageEventBus2(EventBusMessage eventBusMessage){
Log.d("eventBusThread","ThreadMode.ASYNC "+Thread.currentThread().getName());
}
//ThreadMode.BACKGROUND表示该方法在后台运行(也就是子线程),不能够并发处理
//如果发布者在子线程,那么该方法就在子线程执行
//如果发布者在主线程,那么该方法就会创建一个子线程,在子线程运行.
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void MessageEventBus3(EventBusMessage eventBusMessage){
Log.d("eventBusThread","ThreadMode.BACKGROUND "+Thread.currentThread().getName());
}
通过控制台所打印出来的线程名,总结一下输出数据:
在主线程发送事件 在子线程发送事件
main: 主线程 主线程
posting: 主线程 子线程
background: 新开一个子线程 子线程
async: 新开一个子线程 新开一个子线程
概念:黏性事件就是指在EventBus内部被缓存的那些事件 [2]
原理:EventBus为每个类(class)类型保存了最近一次被发送的事件——sticky。后续被发送过来的相同类型的sticky事件会自动替换之前缓存的事件。当一个监听者向EventBus进行注册时,它会去请求缓存事件。这时,缓存的事件就会立即自动发送给这个监听者,有一定的延时性.
使用场景:Android上跨Activity和Fragment生命周期传递数据这种复杂问题,异步调用等等
EventBus的黏性使用方法:(EventBus的环境搭建和EventBus基本使用是一致的)
我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天