上一篇研究了EventBus的使用方法,但随之而来的一系列问题也是值得思考,EventBus到底给项目带来了什么?它与Android原有的消息处理机制有什么区别和优缺点?项目在什么场景下采用EventBus会比较合适?因此,本篇就通过EventBus、BroadCast和Handler(Message)三者的比较解释这三个问题。


1、BroadCast

广播是相对消耗时间、空间最多的一种方式,但是大家都知道,广播是四大组件之一,许多系统级的事件都是通过广播来通知的,比如说网络的变化、电量的变化,短信发送和接收的状态,所以,如果与android系统进行相关的通知,还是要选择本地广播;在BroadcastReceiver的 onReceive方法中,可以获得Context 、intent参数,这两个参数可以调用许多的sdk中的方法,而eventbus获得这两个参数相对比较困难;

因此广播相对于其他的方式而言,广播是重量级的,消耗资源较多的方式。他的优势体现在与sdk连接紧密,如果需要同 android 交互的时候,广播的便捷性会抵消掉它过多的资源消耗,但是如果不同android交互,或者说,只做很少的交互,使用广播是一种浪费;

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

广播的不可替代性在于它可以跨进程进行通信,也就是不同APP之间可以通过广播进行传递数据,并且在OnReceiver中更容易使用Context和Intent对象来执行必要的操作。单就同一app内部的消息通信而言,使用广播是较为消耗资源和笨重的。

2、Handler

handler一般用于线程间通信,它可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),它有两个作用: 
        1.安排消息或Runnable 在某个主线程中某个地方执行; 
        2.安排一个动作在不同的线程中执行。

本篇只讨论handler中与Message相关的的消息通信,一般Handler的使用方法即在调用线程内创建Handler的内部类,并重写handlerMessage(Message msg) 方法,而在发布消息时使用sendMessage方法进行发布,在处理时通过switch(msg.what)进行消息分发并进行相应的处理。这里,Hander内部类和其定义类是绑定的,这就造成了事件发布者和接受者之间的高耦合。而Handler的最大好处是发生问题时,可以非常明确、快速的进行定位,通过msg.what很容易就可以理清每一条消息流的逻辑。

3、EventBus

EventBus的使用方法就不再多做介绍,详细请了解Android开源框架:Android EventBus 的使用

EventBus的优势在于调度灵活。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递,也解除了Handler所带来的耦合,父类对于通知的监听和处理可以继承给子类,这对于简化代码至关重要;通知的优先级,能够保证 Subscriber 关注最重要的通知;粘滞事件(sticky events)能够保证通知不会因 Subscriber 的不在场而忽略。可继承、优先级、粘滞,是 EventBus 比之于广播、观察者等方式最大的优点,它们使得创建结构良好组织紧密的通知系统成为可能。

但EventBus也有很明显的缺陷,在EventBus中事件的分发是通过注解函数的参数类型确定的,因此在事件发布遭到大量滥用时,特别有多个订阅者、多个相同参数时,很难从事件发布者开始理清消息流,无法快速的找出是哪个订阅者接受并处理了消息导致的问题,这就要求了参与者必须对整个通知过程有着良好的理解。当程序代码适量时,这是一个合理的要求,然而当程序太大时,这将成为一种负担。在EventBus中一定要写好必要的注释信息,否则在后续工作交接中会产生很多不必要的麻烦。

Android消息处理:EventBus、BroadCast和Handler-优缺点比较相关推荐

  1. 深入理解Android消息处理系统——Looper、Handler、Thread

    引用自:http://my.unix-center.net/~Simon_fu/?p=652 熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统.而Andro ...

  2. Android消息处理系统——Looper、Handler、Thread(转载)

    熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统.而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制.实际上谷歌参考了Windows的 ...

  3. Android 消息处理机制(Looper、Handler、MessageQueue,Message)

    原文:[简书原文](http://www.jianshu.com/p/02962454adf7)> 另外本人自己开了开了个人博客 fanmingyi.cn 不定时更新[跳转到个人博客](http ...

  4. Android消息处理机制(Handler、Looper、MessageQueue与Message)

    http://www.cnblogs.com/angeldevil/p/3340644.html 既然android给我们提供了Handler机制来解决这样的问题,请看如下代码: 转载于:https: ...

  5. Android消息处理机制

    Google参考了Windows的消息处理机制,在Android系统中实现了一套类似的消息处理机制.学习Android的消息处理机制,有几个概念(类)必须了解: 1.       Message 消息 ...

  6. Android架构分析之Android消息处理机制(一)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在这个系列文章中我们将来分析Android消息处理机制. 本文介绍了一个使用Han ...

  7. android r.java 原理,深入理解Android消息处理系统原理

    Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制.实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制. Android通过Looper.Ha ...

  8. Android多线程分析之三:Handler,Looper的实现

    Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前文<Android多线程分 ...

  9. Android应用开发—Android 消息处理机制:HandlerMessage

    Android 消息处理机制:Handler|Message

最新文章

  1. ubuntu16.04安装新版本golang
  2. Python 基本数据类型、运算符
  3. 后端传给前端 无限极分类_学徒|记者亲身体验垃圾分拣,臭到崩溃!我们还有什么理由不做垃圾分类?...
  4. android 8.0 移除静态注册广播
  5. 计算机视觉应用的简称,计算机视觉应用之图像检索任务简单介绍
  6. linux 重名名、删除文件操作
  7. python中的构造函数和构造函数和析构函数的作用
  8. .NET Standard 2.0 特性介绍和使用指南
  9. SVN的搭建(入门篇)
  10. 超市商品摆放图片_商品摆放舍不得拿、干净又卫生的马来西亚版大润发——NSK超市...
  11. 数字信号处理思维导图
  12. 怀集天气预报软件测试,【天气】怀集要入夏?这份天气预报告诉你答案!
  13. (转)“不开心”的10种英语表达
  14. html怎么统计总访问量,如何实现对网站页面访问量的统计?
  15. 百度API---详解
  16. Upload_上传_并传递额外参数
  17. ACL 2022 | DialogVED:用于对话回复生成的预训练隐变量编码-解码模型
  18. 《WinForm开发系列之控件篇》Item2 BindingNavigator
  19. 必备技能 |《 Python数据挖掘》之什么是哑变量?
  20. 快收下这份拼接视频方法攻略,制作出你想要的视频

热门文章

  1. C++知识点41——运算符的重载概念与分数类实现(下)
  2. ANSYS配合时如何选择重合面(打开爆炸视图)
  3. Opencv腐蚀操作去除激光反光光斑
  4. python提供两个对象身份比较操作符什么和什么来测试_python - 第二部分
  5. retrofit2 spring接受参数_Spring面试中有可能遇到的问题
  6. 怎么设置表格根据窗口自动调整_Word排版技巧之表格美化,你值得拥有!
  7. 关于startActivityForResult
  8. Nginx-场景实践篇
  9. Fork 一个仓库并同步
  10. vs2008打开aspx设计界面无响应问题解决方法