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 可以用来接收所发送的事件

      下面给出我的代码截图


EventBus3.0防踩坑指南_第1张图片
MainActivity


EventBus3.0防踩坑指南_第2张图片
TestActivity


EventBus3.0防踩坑指南_第3张图片
PostEvent

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

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

A。

EventBus3.0防踩坑指南_第4张图片
官方使用指南

      官网上说的是要在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

你可能感兴趣的:(EventBus3.0防踩坑指南)