本文在CSDN博客首发
转载请注明出处
http://blog.csdn.net/u011071427/article/details/53761060
本文出自Allen李的博客

前言

Brocast Receiver:广播接收者——Android系统自带的广播组件。
EventBus:一个发布 / 订阅的事件总线。简单的说:就是两人约定好怎么通信,一人发布消息,另外一个约定好的人立马接收到你发的消息。EventBus可以帮减少很多事,不管你在任何地方任何位置发布一个事件,接收者都能立马接收到你的消息,不用你考虑android子线程操作UI线程的问题。

EventBus

EventBus是GreenRobot的一个开源库。EventBus官网上是这么介绍EventBus的:

EventBus是一个开源库,用来让Android开发中订阅者/接收者降低耦合度的。EventBus使中央通信解耦类只有几行代码,简化代码,移除依赖,和加速应用程序开发。

EventBus的优点

  • 简化了组件之间的通信
  • 解耦事件发送者和接受者
  • 在Activty,Fragment,和Service中表现良好
  • 避免了复杂且容易出错的依赖关系和生命周期问题
  • 快,专为高性能优化
  • 很小(<50K Jar)

EventBus的特点

  • 基于注解的API:简答的使用只要把@Subscribe注解到方法上就可以。
  • 可以在Android的主线程使用。
  • 可以在Service中使用。
  • EventBus的订阅者可以被继承订阅。
  • 不需要任何初始化等配置。
  • EventBus可以使用Builder模式构建你需要的EventBus。

EventBus的使用

EventBus已经上传到JCenter仓库和Maven仓库,所以只需添加依赖关系到项目。

compile 'org.greenrobot:eventbus:3.0.0'//版本号是发文前最高版本号

为什么使用EventBus而不使用BrocastReceiver

广播作为Android组件间的通信方式,可以使用的场景如下:
- 同一app内部的同一组件内的消息通信(单个或多个线程之间);
- 同一app内部的不同组件之间的消息通信(单个进程);
- 同一app具有多个进程的不同组件之间的消息通信;
- 不同app之间的组件之间消息通信;
- Android系统在特定情况下与App之间的消息通信;

EventBus与BrocastReceiver两者都是观察者模式。BrocastReceiver能做到的EventBus都能做到。
但是EventBus是为了同一进程的发送和接收而设计的。
BrocastReceiver则可以使用在不同的进程中。

相对之下,EventBus虽然少了进程间的通讯,但是针对同一进程来说,EventBus的使用方便,并且非常简单,在实际开发中使用EventBus能够节省不少的开发时间。

EventBus的使用demo

第一步:定义POJO类

public class MessageEvent {    public final String message;    public MessageEvent(String message) {        this.message = message;    }}

第二步:准备接收者

// 接收到的信息将回调到主线程@Subscribe(threadMode = ThreadMode.MAIN)public void onMessageEvent(MessageEvent event) {    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();}// 这个方法只能接收到SomeOtherEvent类型的信息@Subscribepublic void handleSomethingElse(SomeOtherEvent event) {    doSomethingWith(event);}

接收者需要注册和注销,通常是在Android中Activity,Fragemnt的生命周期里面进行注册

@Overridepublic void onStart() {    super.onStart();    EventBus.getDefault().register(this);}@Overridepublic void onStop() {    EventBus.getDefault().unregister(this);    super.onStop();}

第三步:发送事件

从代码的任何部分发送事件,所有注册的接收者,匹配到相同类型以后就可以得到它。

EventBus.getDefault().post(new MessageEvent("Hello everyone!"));

参考文献

  • EventBus官网
  • Android的BroadcastReceiver和EventBus区别是什么
  • BroadcastReciver和EventBus区别

更多相关文章

  1. android使用AIDL跨进程通信(IPC)
  2. 树莓派与Android客户端进行socket通信
  3. Android入门:深入学习理解 Handler HandlerThread AsyncQueryHan
  4. Android-Handler机制详解并自定义Handler
  5. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不
  6. android wifi之 AsyncChannel类消息通道
  7. monodroid开发之--call Hanlder
  8. Android(安卓)中使用极光推送消息详细介绍(一)
  9. Android(安卓)Push Notification

随机推荐

  1. SpringBoot实现文件上传与下载功能的示例
  2. 您的位置:首页 → 脚本专栏 → Golang →
  3. 虚拟机ping不通的几种原因及解决办法
  4. error: Pulling is not possible because
  5. 报错内容:1045 - Access denied for user
  6. 0519作业localstorage
  7. 想做一个网站,需要学些什么?
  8. 百度会对每个页面单独评级
  9. 初学者如何画好耳朵?二次元耳朵画法教程
  10. 插画构图如何学习?插画构图技巧!