美文网首页
EventBus介绍与使用禁区

EventBus介绍与使用禁区

作者: 愈强 | 来源:发表于2020-09-01 18:24 被阅读0次

    EventBus(Github)为Android开发提供了一套解耦合的消息发送与接收的解决方案。支持使用注解注册接收者、支持跨线程发送/接收消息、支持指定接收消息的线程、支持任意的消息类型。

    EventBus的内部是使用观察者模式实现的。众所周知,观察者模式的使用过程是需要注册与注销并存的,使用EventBus也必须要注册注销成对出现,否则会出现内存泄露。不过开发者可以对其进行封装,使用弱引用进行注册,可以解决这个问题。

    作为跨模块的通信方式,EventBus可以有很多种使用场景。典型的如:账号登录、退出,此时发送一个消息,让关注账号的模块及时作出相应。相比Android提供的广播(Broadcast)或局部广播(LocalBroadcast),代码要简单的多,写法不要太爽!

    虽然EventBus使用起来很简单,但是也有些是需要禁止的写法:

    禁止使用系统类型作为消息载体

    EventBus发送的消息可以是任何类型,包括基本类型(int、byte等)和系统定义的类型(String等)。

    为什么要禁止使用这样的数据呢?因为任何人在任何位置都能够直接发送这样的消息,甚至不需要定义一个常量。这一点对于一个复杂庞大的系统来说是致命的。

    试想一下,你在一个接收int消息的方法中,想查找一下这个消息是由哪里发送出来的,你可能需要在几个甚至十几个发送int消息的源头进行打点。如果这个int值是可能变化的,那么这个数据可能会飙升到几十甚至上百个。

    但是如果定义了一个消息类,那么只需要监控这个消息对象的创建就可以了,及时有几百个发送点,也能够迅速找到源头。

    禁止在单消息链路中使用EventBus

    一个调用链路中包含了多个方法,最后的方法通过异步产生一个数据,这个数据要通过原路返回到最初的调用点。在这种情况下,切忌为了方便,直接一个EventBus消息将最后的消息发送到最初的调用者上。当时确实方便了,但是后续的开发维护将是一个噩梦。那么要怎么做呢?

    先看一下方法单一性的要求:

    方法的输入要尽量在入参中表达,如无必要,不要在其他地方获取。
    方法的输出要在返回值或回调接口中体现,不应该以其他形式提供给调用者。

    所以方案很简单,就是最后一个方法提供一个回调接口,令调用者实现该接口用于接收消息。在调用的链路中,调用者也可以对该接口进行封装(Wrapper)、代理(Proxy)、转调(Adapter)等。

    总结

    “当你手里有一把锤子的时候,看什么都像钉子。”EventBus确实好用,但是一定要用好,切忌乱用。

    相关文章

      网友评论

          本文标题:EventBus介绍与使用禁区

          本文链接:https://www.haomeiwen.com/subject/hohwqktx.html