EventBus-再也不用什么Handler了

简介:

我在实际项目中使用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,如需转载请自行联系原作者


相关文章
|
存储 网络协议 物联网
Android集成MQTT教程:实现高效通信和实时消息传输
Android集成MQTT教程:实现高效通信和实时消息传输
3172 0
|
SQL 存储 数据可视化
MSSQL之二 Sql Server中管理库与表
MSSQL之二 Sql Server中管理库与表
150 0
|
9月前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
4月前
|
数据挖掘 Linux 索引
服务器数据恢复—服务器意外断电导致数据丢失的数据恢复案例
一台安装linux系统的服务器意外断电。管理员重启服务器后进行检测,发现服务器上部分文件丢失。管理员没有进行任何操作,直接将服务器正常关机并切断电源。
|
4月前
|
人工智能 搜索推荐 小程序
AI故事随心绘:多主体ID保留,个性化生成
近期通义实验室提出了一种AnyStory的方法,旨在实现高质量的个性化文本到图像生成,支持单个和多个主体。
130 1
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
View的绘制和事件处理是两个重要的主题,上一篇《图解 Android事件分发机制》已经把事件的分发机制讲得比较详细了,这一篇是针对View的绘制,View的绘制如果你有所了解,基本分为measure、layout、draw 过程,其中比较难理解就是measure过程,所以本篇文章大幅笔地分析measure过程,相对讲得比较详细,文章也比较长,如果你对View的绘制还不是很懂,对measure过程掌握得不是很深刻,那么耐心点,看完这篇文章,相信你会有所收获的。
258 3
|
5月前
|
SQL IDE 关系型数据库
JetBrains DataGrip 2025.1 发布 - 数据库和 SQL 跨平台 IDE
JetBrains DataGrip 2025.1 (macOS, Linux, Windows) - 数据库和 SQL 跨平台 IDE
317 0
|
边缘计算 人工智能 Cloud Native
云原生架构的演变与未来展望
在数字化转型的浪潮中,云原生技术成为企业IT战略的核心。本文深入探讨了云原生架构从起步到成熟的发展脉络,分析了容器化、微服务和持续交付等关键技术如何推动应用现代化,并预测了云原生技术的未来趋势,如边缘计算、AI增强和多云管理。同时,文章也对云原生实践过程中可能遇到的安全挑战、技术复杂性以及人才缺口问题提出了见解,旨在为读者提供一份全面的云原生技术指南。
304 28
|
11月前
|
物联网
物联网卡没使用会产生费用吗
物联网卡的使用费用情况通常取决于多个因素,包括卡片的类型、服务商的政策、套餐选择以及是否激活并实际使用等。对于“物联网卡没使用是否会产生费用”这一问题,答案并非绝对,而是需要根据具体情况来判断。
|
10月前
|
存储 人工智能 缓存
【AI系统】核心计算之矩阵乘
本文探讨了AI模型中矩阵乘运算的优化实现及其在AI芯片设计中的重要性。文章首先介绍了卷积操作如何转化为矩阵乘,接着阐述了矩阵乘的分块(Tiling)技术以适应芯片内存限制,最后总结了几种常见的矩阵乘优化方法,包括循环优化、分块矩阵乘法、SIMD指令优化等,旨在提高计算效率和性能。
344 0