国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

“入职接手旧项目,所有网络请求数据通过 Eve

发布时间:2019/09/11标签:   线程    点击量:

原标题:“入职接手旧项目,所有网络请求数据通过 Eve
一. 序固然当初互联网行业的失业情势「相称严格」,张小胖仍是胜利跳槽涨薪。入职第一天 Leader 说,“你刚来,这周先熟习熟习我们的名目吧”。张小胖纯熟的用 Git pull 代码到当地,情况变量一通设置,终究把名目跑了起来,看着名目里的收集恳求数据,竟然满是靠 EventBus 散发,堕入了深深的寻思…在子线程恳求数据,再经过 EventBus 将数据散发到主线程,这是甚么骚操纵?这岂非不会有成绩吗?固然 EventBus 能够做到多模块之间低耦合的变乱通讯,可完整应用 EventBus 去做线程切换,解耦是解耦了,但靠谱的名目基本不会这么干。不外既然聊到了 EventBus 的线程切换,那明天就深刻聊聊当 EventBus 变乱散发,赶上线程切换的时间,是怎样处置的。以及应用的时间有甚么须要留神的,大批的依靠 EventBus 的线程切换,会不会无效率成绩。二. EventBus 的线程切换2.1 EventBus 切换线程EventBus 是一个基于观看者形式的变乱定阅/公布框架。应用 EventBus 能够在差别模块之间,完成低耦合的新闻通讯。EventBus 出生以来这么多年,在许多出产名目中都能够看到它的身影。而从更新日记能够看到,除了体积小,它还很稳固,这两年就没更新过,最初一次更新也只是由于支撑全部的 JVM,让其应用范畴不只仅范围在 Android 上。堪称长短常的稳固,稳固到让人有一种感到,如果你应用 EventBus 呈现了甚么成绩,那必定是你应用的方法错误。EventBus 的应用方法,关于 Android 老司机来讲,必定是不生疏的,相干材料太多,这里就不再赘述了。在 Android 下,线程的切换是一个很罕用并且很必需的操纵,EventBus 除了能够定阅和发送新闻以外,它还能够指定接收新闻处置新闻的线程。也就是说,不管你 post() 新闻时处在甚么线程中,EventBus 都能够将新闻散发到你指定的线程下来,听下来就感到十分的便利。不外不管怎样切换,无外乎几种情形: UI 线程切子线程。 子线程切 UI 线程。 子线程切其余子线程。在咱们应用 EventBus 注册新闻的时间,能够经过 @Subscribe 注解来实现注册变乱, @Subscribe 中能够经过参数 threadMode 来指定应用谁人线程来接受新闻。@Subscribe(threadMode=ThreadMode.MAIN)funonEventTest(event:TestEvent){//处置变乱}threadMode 是一个 enum,有多种形式可供抉择: POSTING,默许值,谁人线程发就是谁人线程收。 MAIN,切换至主线程接受变乱。 MAIN_ORDERED,v3.1.1 中新增的属性,也是切换至主线程接受变乱,然而和 MAIN 有些许差别,前面具体讲。 BACKGROUND,确保在子线程中接受变乱。细节就是,假如是主线程发送的新闻,会切换到子线程接受,而假如变乱自身就是由子线程收回,会间接应用发送变乱新闻的线程处置新闻。 ASYNC,确保在子线程中接受变乱,然而和 BACKGROUND 的差别在于,它不会辨别发送线程能否是子线程,而是每次都在差别的线程中接受变乱。 EventBus 的线程切换,重要波及的方式就是 EventBus 的 postToSubscription()方式。privatevoidpostToSubscription(Subscriptionsubscription,Objectevent,booleanisMainThread){switch(subscription.subscriberMethod.threadMode){casePOSTING:invokeSubscriber(subscription,event);break;caseMAIN:if(isMainThread){invokeSubscriber(subscription,event);}else{mainThreadPoster.enqueue(subscription,event);}break;caseMAIN_ORDERED:if(mainThreadPoster!=null){mainThreadPoster.enqueue(subscription,event);}else{//temporary:technicallynotcorrectasposternotdecoupledfromsubscriberinvokeSubscriber(subscription,event);}break;caseBACKGROUND:if(isMainThread){backgroundPoster.enqueue(subscription,event);}else{invokeSubscriber(subscription,event);}break;caseASYNC:asyncPoster.enqueue(subscription,event);break;default:thrownewIllegalStateException("Unknownthreadmode:"+subscription.subscriberMethod.threadMode);}}

版权信息Copyright © 银河官网 版权所有    ICP备案编号:鲁ICP备09013610号