EventBus3.0防踩坑指南

    实用过EventBus的人都知道,这个轻量简便的lib真的很好用,耦合度低,

能满足很多场合的使用,不过3.0貌似更好用了,使用也更灵活了。下面给出

官方的使用地址,大家可以去官网了解熟悉下,EventBus3.0.

    Event的使用,3.0引入管擦着模式,Subscriber:事件订阅者,在EventBus3.0

之前消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgr

oundThread和onEventAsync,他们分别代表四种线程模型。而在EventBus3.0之后

,事件处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定

线程模型(默认为POSTING),四种线程模型下面会讲到。

       EventBus3.0线程模式

      POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事

件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和

接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操

作,因为它会阻塞事件的传递,甚至有可能会引起ANR。

      MAIN:事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。

      BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在

新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在

发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。

      ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,

同样,此事件处理函数中禁止进行UI更新操作。

      四种线程,大家可以根据需要对线程进行控制,线程模式是的EventBus使用起来更

加灵活,选择性也更多。说了这么多没用的 下面个大家介绍下到底怎么用

      使用之前,需要先在gradle中添加

      //EventBus

      compile'org.greenrobot:eventbus:3.0.0'

      主要方法 事件订阅,也就是之前的注册  EventBus.getDefault().register(this);

                      取消订阅  EventBus.getDefault().unregister(this);

                      事件发送  EventBus.getDefault().post(messageEvent);

                      事件接收 @Subscribe(threadMode=ThreadMode.MAIN)

                                     public void onMessageEvent(PostEventevent) {}

                      粘性事件  EventBus.getDefault().postSticky() (粘性事件是发送后再订阅,

                                    异于普通事件)

     用法  创建一个java类 public class PostEvent{/**  类的名字没有局限性,可以随意定

               义   */}  EventBus.getDefault().post(new PostEvent()) 这个时候 ,就可以在需

              要的地方发送事件了 onMessageEvent 可以用来接收所发送的事件

      下面给出我的代码截图


MainActivity


TestActivity


PostEvent

      代码很简单,这里我没有使用粘性事件。上面是根据官方接收的使用方法来实现的

,不过既然是防踩坑,好像跑题了,下面给大家讲解我遇到的情况。

A。

官方使用指南

      官网上说的是要在onStart()中进行订阅,在onStop()中进行取消定语,单貌似这样在

Activity中是行不通的,这样无法接收到事件。熟悉Activity生命周期的都应该知道为什么

吧,这里不再赘述,个人建议,事件订阅放在onCreate()方法中,而注销,要放在onD

estory()中。

B。之前查阅的时候,有人说EventBus3.0要处理不同场所发出的事件的时候要写不同的

java类,这养就要写很多的java事件类,请注意看我上面写的PostEvent类(可根据需

要,自行进行扩展),在这个类中我定义了三个 变量 tag(事件标签 、代号) what(事件

类型,不同事件对应不同类型)event (事件内容)。这样就不需要对应的事件写不同的

java类了,而且,如果写了那么多类,你分得清楚你接收的是哪个java类么?无形中不是

给自己增加了麻烦吗?


      不知道上面的两个问题 ,大家有没有遇到呢?

    总结:1.使用之前,需要先下载,compile'org.greenrobot:eventbus:3.0.0'加到gradle

                   中

               2. 使用常规的订阅及解订阅方式,在需要的地方发送事件,事件类根据自己需

                   要自行定义

              3. 在需要的地方调用 onMessageEvent进行事件接收(订阅过事件一定要解除

                 订 阅,并且 订阅过事件后必须调用onMessageEvent()方法),不要忘了注

                 解@Subscribe(threadMode=ThreadMode.MAIN) 线程根据需要自己切换

       以上为笔者愚见,并且在使用过程中遇到的问题处理方式,工具都是怎么简单怎么

来,易于维护才是王道,当然每个人都有自己得使用心得,适合自己得,才是最好的。

下面给出源码,需要的可以下载看看 http://download.csdn.net/download/qq_27234017/9990752

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容