? “入职接手旧项目,所有网络请求数据通过 EventBus 分发,吓得我想离职...”_CQITer_重庆IT人之家 yabo10.com亚博体育,亚博娱乐在线网站,亚博国际娱乐7171 ?

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

?

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

一. 序

虽然现在亚博娱乐在线网站行业的就业形式「相当严峻」,张小胖还是成功跳槽涨薪。

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

张小胖熟练的用 Gyabo10.com亚博体育 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)?{?

??swyabo10.com亚博体育ch?(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?{?

相关推荐
新闻聚焦
猜你喜欢
热门推荐
  • 微软AI面试题有多难?这里有一份样卷

      究竟什么样的AI人才能被微软这样的巨头聘用呢?今天,文摘君就淘来了几道微软AI 面试题,同时给出了最基本的解答......

    06-25????来源:澎湃新闻网

    分享
  • 腾讯吐个槽“讲产品故事拿大奖”活动:

      每一个产品故事都值得被聆听, 每一位奋斗者的历程都值得被肯定! 今天,「吐个槽」X「腾讯课堂产品学院」发起讲产品故......

    09-02????来源:未知

    分享
  • 全球最聪明的大脑怎么看AI?他们预测了

      2017年AI领域取得了诸多成果。2018年AI又将何去何从?以下是来自世界顶级研究人员和行业领军人物对2018年AI领域发展作......

    02-20????来源:虎嗅网

    分享
  • 2017JavaScript框架战报 - React分战场

      我们来看看与React有关的软件包的生态系统。当Facebook构建React时,就有许多来自开源社区的第三方软件包。为提供完......

    02-27????来源:湖北新闻网

    分享
  • 小白学数据:教你用Python实现简单监督学

      监督学习作为运用最广泛的机器学习方法,一直以来都是从数据挖掘信息的重要手段。即便是在无监督学习兴起的近......

    03-05????来源:今日头条

    分享
  • 现代编程语言Swift、Kotlin等十大有趣功能

      最近学习了一些现代编程语言,比如Reason,Swift,Kotlin和Dart。这些编程语言提供了许多新功能,本文主要分享了我认......

    04-29????来源:祁东新闻网

    分享
  • 领域场景分析的6W模型

      组成场景的要素常常被称之为6W模型,即描写场景的过程必须包含Who,What,Why,Where,When与hoW这六个要素。......

    04-30????来源:砍柴网

    分享
  • 开源应用服务器WildFly 12发新季度交付模式

      WildFly 12 Final版本现在已经可以下载了,WildFly是一款灵活的开源应用服务器,支持开发人员构建轻量级应用程序。支持......

    05-10????来源:青岛新闻网

    分享
  • 基于Spring Cloud的微服务落地

      微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务。但如果要将微服务架构运用到生产项目上,......

    06-04????来源:广西新闻网

    分享
  • 为什么阿里工程师纷纷在内网晒代码?

      前阵子,在阿里一个小黑屋里,5名对代码有着极致追求的工程师参与阿里代码领域最高荣誉“多隆奖”的最终角逐。......

    06-08????来源:四川新闻网

    分享
返回列表
Ctrl+D?将本页面保存为书签,全面了解最新资讯,方便快捷。