“入职接手旧项目,所有网络请求数据通过 EventBus 分发,吓得我想离职...”

作者:媒体转发 时间:2019-09-13 16:45

字号

 

“入职接手旧项目,所有网络请求数据通过 EventBus 分发,吓得我想离职...”

一. 序

虽然现在互联网行业的就业形式「相当严峻」,张小胖还是成功跳槽涨薪。

入职第一天 Leader 说,“你刚来,这周先熟悉熟悉咱们的项目吧”。

张小胖熟练的用 Git pull 代码到本地,环境变量一通配置,终于把项目跑了起来,看着项目里的网络请求数据,居然全是靠 EventBus 分发,陷入了深深的沉思…

在子线程请求数据,再通过 EventBus 将数据分发到主线程,这是什么骚操作?这难道不会有问题吗?

虽然 EventBus 可以做到多模块之间低耦合的事件通信,可完全利用 EventBus 去做线程切换,解耦是解耦了,但靠谱的项目根本不会这么干。

不过既然聊到了 EventBus 的线程切换,那今天就深入聊聊当 EventBus 事件分发,遇上线程切换的时候,是如何处理的。以及使用的时候有什么需要注意的,大量的依赖 EventBus 的线程切换,会不会有效率问题。

二. EventBus 的线程切换

2.1 EventBus 切换线程

EventBus 是一个基于观察者模式的事件订阅/发布框架。利用 EventBus 可以在不同模块之间,实现低耦合的消息通信。

“入职接手旧项目,所有网络请求数据通过 EventBus 分发,吓得我想离职...”

EventBus 诞生以来这么多年,在很多生产项目中都可以看到它的身影。而从更新日志可以看到,除了体积小,它还很稳定,这两年就没更新过,最后一次更新也只是因为支持所有的 JVM,让其使用范围不仅仅局限在 Android 上。

可谓是非常的稳定,稳定到让人有一种感觉,要是你使用 EventBus 出现了什么问题,那一定是你使用的方式不对。

EventBus 的使用方式,对于 Android 老司机来说,必然是不陌生的,相关资料太多,这里就不再赘述了。

在 Android 下,线程的切换是一个很常用而且很必须的操作,EventBus 除了可以订阅和发送消息之外,它还可以指定接受消息处理消息的线程。

也就是说,无论你 post() 消息时处在什么线程中,EventBus 都可以将消息分发到你指定的线程上去,听上去就感觉非常的方便。

不过无论怎么切换,无外乎几种情况:

UI 线程切子线程。

子线程切 UI 线程。

子线程切其他子线程。

在我们使用 EventBus 注册消息的时候,可以通过 @Subscribe 注解来完成注册事件, @Subscribe 中可以通过参数 threadMode 来指定使用那个线程来接收消息。

@Subscribe(threadMode = ThreadMode.MAIN) 

fun onEventTest(event:TestEvent){ 

  // 处理事件 

threadMode 是一个 enum,有多种模式可供选择:

POSTING,默认值,那个线程发就是那个线程收。

MAIN,切换至主线程接收事件。

MAIN_ORDERED,v3.1.1 中新增的属性,也是切换至主线程接收事件,但是和 MAIN 有些许区别,后面详细讲。

BACKGROUND,确保在子线程中接收事件。细节就是,如果是主线程发送的消息,会切换到子线程接收,而如果事件本身就是由子线程发出,会直接使用发送事件消息的线程处理消息。

ASYNC,确保在子线程中接收事件,但是和 BACKGROUND 的区别在于,它不会区分发送线程是否是子线程,而是每次都在不同的线程中接收事件。

EventBus 的线程切换,主要涉及的方法就是 EventBus 的 postToSubscription()方法。

private void postToSubscription(Subscription subscription, Object event, boolean isMainThread) { 

  switch (subscription.subscriberMethod.threadMode) { 

    case POSTING: 

      invokeSubscriber(subscription, event); 

      break; 

    case MAIN: 

      if (isMainThread) { 

        invokeSubscriber(subscription, event); 

      } else { 

        mainThreadPoster.enqueue(subscription, event); 

      } 

      break; 

    case MAIN_ORDERED: 

      if (mainThreadPoster != null) { 

        mainThreadPoster.enqueue(subscription, event); 

      } else { 

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
关键词 >>网络 入职 数据
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接