在学习前先贴上GitHub地址
然后GitHub官网教程
毕竟官方的才是最好的!这里只是分享下学习经验
什么是EventBus
EventBus是基于发布/订阅的消息总线。
它简化了Activities, Fragments, Threads, Services等之间的通信
消息总线,有三个主要的元素:
Event:事件
Subscriber:事件订阅者,接收特定的事件
Publisher:事件发布者,用于通知Subscriber有事件发生
EventBus使用的 3个步骤
定义事件:
public static class MessageEvent { /* Additional fields if needed */ }
准备订阅者:声明和注释您的订阅方法,可选择指定线程模式:
@Subscribe(threadMode = ThreadMode . MAIN) 公共 无效
onMessageEvent(MessageEvent的事件){ / *做一些事情* / };
注册并取消注册您的订阅者。例如在Android上,活动和片段通常应根据其生命周期进行注册:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}@Override
public void onDestroy() {
super.onStop();
EventBus.getDefault().unregister(this);
}
注:在实际项目中我们把注册和反注册会放在onCaerta和onDestroy,部分场景下onStart会无法注册.这个问题去看下生命周期吧!
发布活动:
EventBus 。getDefault()。post(new MessageEvent());
threadMode线程模式
@Subscribe(threadMode = ThreadMode . MAIN)
然后在订阅的时候我们发现有一个threadMode,可选择指定线程模式.
我们来学习下有什么样的线程模式:
ThreadMode: POSTING
这个线程模式是默认的,代表这个方法会在当前发布事件的线程执行
// Called in the same thread (default)
// ThreadMode is optional here
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
log(event.message);
}
ThreadMode: MAIN
代表这个方法会在UI线程执行
// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}
ThreadMode: BACKGROUND
这个方法,如果在非UI线程发布的事件,则直接执行。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用。
// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
saveToDisk(event.message);
}
ThreadMode: ASYNC
代表它在单独的线程中调用,使用线程池来有效地重用线程完成的异步事件处理程序的通知。
// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
backend.send(event.message);
}
eventbus的优点和缺点
优点:
- 简化组件之间的通信
- 分离事件发送者和接收者
- 对Activity,Fragment和后台线程表现良好
- 避免复杂和容易出错的依赖关系和生命周期问题
- 使您的代码更简单
- 可定制行强,耦合度低
缺点:
- 代码逻辑的分散
- 代码进行混淆会出现错误(新版可以通过注解解决)
安卓中组件数据传递方式
在安卓中经常使用的数据传递方式有:广播、Handler、Intent、观察者模式,现在有了eventbus在我们再也不用苦恼在Fragment中如何传递数据了!
eventbus、RxJava、Handler区别
在很多时候大家都会把三个的概念混淆,下面我来整理下三个的区别:
1.EventBus :一个基于发布 / 订阅的消息总线。
2.Handler:Android异步消息处理线程
3.RxJava:一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库
通过上面的介绍大家可以明确的知道EventBus是一个消息总线,简单点说,就是两人约定好怎么通信,一人发布消息,另外一个约定好的人就能接收到你发出的消息。
Handler和RxJava的关键在一个“异步”,虽然我们经常使用Handler和RxJava来传递消息,但是这不是他的全部。它还能处理耗时操作,更新UI…它们侧重点应该是在异步。
虽然在项目中使用了EventBus,可能还有认识不足的!下面我会写几个demo继续学习!