在学习前先贴上GitHub地址
https://github.com/greenrobot/EventBus
然后GitHub官网教程
http://greenrobot.org/eventbus/
毕竟官方的才是最好的!这里只是分享下学习经验
什么是EventBus EventBus是基于发布/订阅的消息总线。 它简化了Activities, Fragments, Threads, Services等之间的通信
消息总线,有三个主要的元素: Event:事件 Subscriber:事件订阅者,接收特定的事件 Publisher:事件发布者,用于通知Subscriber有事件发生
定义事件:
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());
@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中如何传递数据了!
在很多时候大家都会把三个的概念混淆,下面我来整理下三个的区别: 1.EventBus :一个基于发布 / 订阅的消息总线。 2.Handler:Android异步消息处理线程 3.RxJava:一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 通过上面的介绍大家可以明确的知道EventBus是一个消息总线,简单点说,就是两人约定好怎么通信,一人发布消息,另外一个约定好的人就能接收到你发出的消息。 Handler和RxJava的关键在一个“异步”,虽然我们经常使用Handler和RxJava来传递消息,但是这不是他的全部。它还能处理耗时操作,更新UI…它们侧重点应该是在异步。
虽然在项目中使用了EventBus,可能还有认识不足的!下面我会写几个demo继续学习!