我在实际项目中使用EventBus经验总结:

刚开始听到EventBus的时候,觉得好像比较高大上,没有学过,不敢用。但是还是情不自禁的用到了项目当中。但是随着EventBus使用的地方越多,问题就出现了,就像见了鬼一样。

问题1

》描述:比如在Activity里有2个或多个Fragment,在两个Fragment里都会在子线程中发布

MessageEvent在UI线程里吐司。但是问题来了,在FragmentA里我会请求网络,然后我又到了

FragmentB中,竟然会接受到了FragmentA里的消息事件。

》原因分析:既然在Fragment里可以接受到FragmentA的消息,说明FragmentA没有unRegist事件。

原因是我照搬网上的代码,在onCreate里订阅事件,在onDestroy里unRegist事件。

但实际上从FragmentA切换到FragmentB的时候,FragmentA是没有走onDestroy方法的。

》解析方案:于是我决定在onStart与onStop方法里来走regist与unRegist方法。

虽然这个问题解决了,但是新的问题又来了。FragmentA里的吐司事件又接收不到了,

原因是FragmentA里的事件是在onActivityCreated方法里执行的,而这个生命周期的方

法又是在onStart之前执行的。所以当请求网络回调发布事件的时候,还没有订阅事件。

于是乎,我做了一个双重保险:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    EventBus.getDefault().register(this);
}
@Override
public void onStart() {
    super.onStart();
    if(!EventBus.getDefault().isRegistered(this)){
        EventBus.getDefault().register(this);
    }
}
@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}
@Override
public void onDestroyView() {
    super.onDestroyView();
    ButterKnife.reset(this);
    if(EventBus.getDefault().isRegistered(this)){
        EventBus.getDefault().unregister(this);
    }
}

问题2

搞开发就是这样,问题问题层出不穷。

》描述:进入登录Fragment,没有点击登录按钮就退出了。竟然还解析了登录,并且登录的吐司竟然弹在了主页上。

》原因分析:最开始,打的bug竟然没有走,后来又走了,才找到原因。事件定义重复了,主页在

onResume里请求网络会发布一个事件,因为事件的int类型与登录Fragment里订阅的登录

解析事件的int型相重复。但是即使是这样,登录Fragment关闭了不可能接收到主页的事

件啊。主要原因还是因为登录Fragment的onDestroy方法有延迟,登录Fragment虽然不

见了,但是触发了主页Fragment的onResume事件,登录Fragment没有来得及取消订阅就

接受到了主页Fragment的登录解析事件,然后又把吐司给主页Fragment了。

》解决方案:只要将冲突的事件int类型值改一下就行了。

综上所述,EventBus订阅与取消订阅要及时准确(对所在类的生命周期把握准确),事件的定义(不同事件一定要有唯一标识),另外还有一点,事件类容易越写越多,要注意重构抽取。

  1. EventBus概论

EventBus是Google Guava库里的一个类,用来进行消息传递,线程之间通讯。

2.EventBus的使用

首先必须要入库

onCreate()  注册EventBus    EventBus.register(Object ),注册的对象决定发布事件的参数

所在方法的反射范围,一般用this,表示扫描当前类中所有的方法。

onDestroy()  注销EventBus   EventBus.unRegister(Object)

发布事件:EventBus.post(参数)   参数可以是任何类型,一般为实体类。

一般在子线程中发布获得的数据,然后通过在主线程中的方法来接收参数,并更新UI。

注意:处理事件的方法一定要加上@Subscribe注解

3.EventBus的底层

EventBus的底层是用反射、集合Map技术。具体请看源码。

资料拓展:http://blog.csdn.net/lmj623565791/article/details/40794879

[转]EventBus使用详解(二)——EventBus使用进阶

http://m.blog.csdn.net/blog/u013173289/43970023

本文转自屠夫章哥  51CTO博客,原文链接:http://blog.51cto.com/4259297/1705632,如需转载请自行联系原作者

EventBus-再也不用什么Handler了相关推荐

  1. 在plsql里面怎么去掉空行_盐渍樱花怎么做?详细做法告诉您,一年都不会坏,学会再也不用买...

    盐渍樱花怎么做?详细做法告诉您,一年都不会坏,赶紧收藏学会它!樱花季说的就是现在,虽然到了飘落的季节,但是还是到处可见的樱花朵朵.俗话说:花无百日红.真的是啊,每年的三四月是最美丽的季节,到处花儿朵朵 ...

  2. “还完花呗,再也不用吃土!”是真的吗?(附代码)

    来源:数据团学社 本文共2000字,建议阅读5分钟. 本文适合有一定Python基础的朋友交流学习,也适合没有接触过Python的朋友了解用途. 七夕前夕,我的暗恋对象邀我共进晚餐,这把我激动的~!! ...

  3. gm怎么刷东西 rust_刷了这种黑板漆再也不用担心吃粉笔灰了

    刷了这种黑板漆再也不用担心吃粉笔灰了 黑板漆正在越来越多的被人们使用,黑板墙很酷很实用,可以用在家里的各个地方,不仅仅是墙面.很多人想要,但又担心实际用起来会有各种问题,被提及最多的就是粉笔灰的问题啦 ...

  4. 软件界面中英文对照_再也不用翻译软件了,弱电行业术语大全及中英文对照表来了~...

    弱电设备上各种专业标识都在使用英文,这对英文水平一般般的人来说实在不友好,不仅影响专业弱电人形象,在工作中也容易出现差池. 本期sin66智慧产业导航小编分享整理了一份弱电行业术语大全及中英文对照表, ...

  5. vi 从第几行到第几行 替换_第三十三章:查找新函数:XLOOKUP,再也不用趴着电脑屏幕数第几列、第几行(二)...

    XLOOKUP查询函数的语法XLOOKUP(lookup_value,lookup_array,return_array,if_not_found,match_mode,search_mode) 第一 ...

  6. 自从装了windows神器,再也不用羡慕mac了

    1. 命令行神器 1.1 GOW Gow(Gnu On Windows)是Cygwin的轻量级替代品. 它使用一个方便的NSIS安装程序,安装超过100个非常有用的开源UNIX应用程序,编译为本机wi ...

  7. 此 sqltransaction 已完成;它再也无法使用_手把手教你如何修眉毛,学会再也不用花钱去美容院了...

    最近看到有网友在评论中询问怎么修眉毛,刚好小编我对修眉有一点研究,可能比不上专业修眉的,但是最少能看不是,今天拿出来献给大家,希望各位自己学会如何修眉毛,那样的话以后就再也不用花钱去美容院了.在此先谢 ...

  8. word公式插件_再也不用担心我的公式写不出来了:一款公式输入神器实测

    → → https://mp.weixin.qq.com/s/gNRWdN-W4_Eb2MyyTpWzjw关注微信公众号:人工智能前沿讲习,重磅干货,第一时间送达 本文推荐一个公式输入神器,只要截图就 ...

  9. 充电电流用软件测试准吗,实验:1A与2.1A对手机充电电流一样的,小伙伴再也不用担心咯...

    新福克斯舒适,USB在手套箱(不方便啊,郁闷),插U盘放MP3, 一个行车记录仪,插在点烟器里,平时没事也够用, 要跑一次长途,用iPhone 5C高德导航,靠,问题来,没方充电,郁闷啊! 在 ...

  10. git for windows_手把手教会舍友玩 Git (包教包会,再也不用担心他的学习)

    作 者: BWH_Steven 原文链接:https://www.cnblogs.com/ideal-20/p/13644420.html 舍友长大想当程序员,我和他爷爷奶奶都可高兴了,写他最喜欢的喜 ...

最新文章

  1. 周志华教授:关于深度学习的一点思考
  2. 弹性分组环(RPR)技术特点及其在城域网中的应用
  3. Spring 建立简单的示例
  4. C#操作Word完全功略!
  5. UVA 11235 Frequent values(RMQ)
  6. laydate组件 无法传值_Vue组件通信的几种方式
  7. caffe学习(1) ubunu 16.04+caffe+cuda8.0+opencv3.1安装
  8. Servlet学习笔记心得(二)
  9. 安装了git以后,idea类名颜色的含义
  10. 【渝粤题库】陕西师范大学800011 专题地图制图
  11. Cap04_项目整体管理
  12. python测量镜头到目标距离_摄像头单目测距原理及实现
  13. 为什么世界上近60%的人使用谷歌Chrome浏览器?
  14. html做一个年份月份天数选择器,jquery编写日期选择器
  15. redis java客户端封装_redis的java客户端Jedis简单封装
  16. 从B站源码泄露事件入手,说一下团队协作中版本管理的安全意识
  17. Word参考文献设置-尾注后添加致谢等内容
  18. 厦门大学马来西亚分校打造更美好的智慧校园
  19. 因计算机中丢失msvcr120.dll,msvcr120.dll丢失怎样修复 附解决方法
  20. 【Android破解笔记】割绳子2内购

热门文章

  1. opengl深度缓冲获得的深度图精度太低_深度学习行人重识别ReID最新综述与展望...
  2. 实施和开发哪个前景好_web前端与java后台开发哪个前景、待遇好?
  3. oracle账号密码修改后特别容易锁定_Oracle数据库账号总是被锁?通过这里就可以发现是哪个IP造成的...
  4. php的参数的乘除,关于PHP在企业中处理数字加减乘除和对比运算方案
  5. php去掉关联数组,php如何删除关联数组
  6. python 返回字符串长度,当使用特殊字符时,Python返回错误的字符串长度
  7. mysql 触发器 赋值_MYSQL的触发器中 变量赋值
  8. 介绍下Nginx 反向代理与负载均衡
  9. 【基础算法】算法,从排序学起(一)
  10. fmod实现声音波形_“老张说数理化”—中考物理专题02-声音与环境(收藏可打印)...