1.说下你可能没用过的解析EventBus
2.消息框架 EventBus 的实现原理
3.Android开发八大模块学习笔记,带你初探Android系统开发全貌
4.Vert.x 源码解析(4.x)——Context源码解析
5.Androidå¼å-EventBus使ç¨è¯¦è§£
6.Vert.x 源码解析(4.x)——Local EvnentBus入门使用和源码解析
说下你可能没用过的源码源码EventBus
最近在Code Review过程中,我发现了一个业务场景:业务处理完成后,解析需要通知审核人员,源码源码通知方式包括短信和邮件。解析代码如下:
这个方法对吗?
针对这种常见的源码源码tyvj 源码业务场景,我们首先会考虑同步或异步发送的解析问题。
如果选择同步,源码源码会对接口的解析响应时间产生影响,并且与业务逻辑紧密耦合,源码源码这显然不是解析好的做法。
一般情况下,源码源码我们会选择异步方式,解析使用消息队列(MQ)进行消息的源码源码发送和消费,或者使用线程池来处理,解析这样不会影响主业务逻辑,可以提高性能,并且实现了解耦。
此外,我们还需要考虑数据一致性的问题,邮件是否一定要发送成功?
大多数情况下,我们并不要求邮件必须%发送成功,失败了就失败了,只要监控告警的失败率不超过阈值即可。同时,消息服务一旦收到请求,应该自行保证消息的投递。
因此,总的来说,使用MQ发送消息并自行处理,或者使用线程池进行异步处理,最后自行处理补偿逻辑,就能解决这类问题。
那么,今天要介绍的码支付悬赏平台源码是这两种解决方案之外的处理方式。对于这种场景,我们可以使用EventBus来解决。
EventBus是事件总线的意思,它是Google Guava库的一个工具,基于观察者模式,可以在进程内实现代码的解耦。
以上面的例子来说,引入MQ可能会有些过于复杂,其实使用EventBus也能达到相同的效果。与MQ相比,EventBus只能提供进程内的消息事件传递,但对于我们的业务场景来说,这已经足够了。
接下来,我们来看一下EventBus的使用方法。首先,创建一个EventBus实例。
第二步,创建一个事件消息订阅者,处理方式非常简单,只需在希望处理事件的方法上添加@Subscribe注解即可。
形参只能有一个,如果定义0个或多个,运行时将会报错。
第三步,注册事件。
第四步,发送事件。
这就是EventBus使用的最简单例子。下面我们看看如何结合开头的例子进行处理。
比如上面提到的案例,比如注册和用户下单的场景,都需要发送消息和邮件给用户。
EventBus并不强制要求我们使用单例模式,转强提示指标源码因为其创建和销毁成本较低,所以更多是根据我们的业务场景和上下文来选择。
在业务逻辑处理完成后,分别注册了邮件和短信两个事件订阅者。
最后,我们发送事件,用户注册时发送一个用户ID,下单成功时发送一个订单ID。
然后写一个测试类进行测试,分别创建两个service,然后分别调用方法。
执行测试类,我们可以看到输出,分别执行了事件订阅的方法。
使用起来你会发现非常简单,对于希望轻量级简单地实现解耦,使用EventBus非常合适。
注意,例子中的参数都是Long类型。如果事件的参数是其他类型,那么消息是无法接收到的。比如,如果我们将下单中发送的订单ID改为String类型,会发现没有消费。因为我们没有定义一个参数类型为String的方法。
去EmailMsgHandler和SmsMsgHandler都新增一个接收String类型的订阅方法,这样就可以接收到了。
除此之外,我们还可以定义一个DeadEvent来处理这种情况,它相当于是一个默认的处理方式。当没有匹配的事件类型参数时,就会默认发送一个DeadEvent事件。
定义一个默认处理器。
给BookingService新增一个pay()支付方法,挖机诊断软件源码下单完成后去支付,注册我们的默认事件。
执行测试bookingService.pay(),看到输出结果:
OK,简单的介绍就到这里。到目前为止,我们所说的都是同步调用,这并不符合我们的要求。我们当然希望使用异步处理更好。
那就看看源码它是如何实现的。
identifier是一个名字,标记,默认是default。
executor是执行器,默认创建一个MoreExecutors.directExecutor(),事件订阅者根据你提供的executor来决定如何执行事件订阅的处理方式。
exceptionHandler是异常处理器,默认创建的就是打点日志。
subscribers是我们的消费者,订阅者。
dispatcher用来做事件分发。
默认创建的executor是一个MoreExecutors.directExecutor(),看到command.run()你就会发现这其实是同步执行。
同步执行并不太好。我们希望不仅解耦,还要异步执行。EventBus提供了AsyncEventBus,我们可以自己传入executor。
上面的代码我们改成异步的,这样不就好起来了嘛。实际上,我们可以结合自己的线程池来处理。
OK,这个说清楚了。视频下载小程序源码我们可以顺便再看看事件分发的处理。看到DeadEvent了吗?没有当前事件的订阅者,就会发送一个DeadEvent事件,bingo!
OK,这个使用和源码都比较简单,有兴趣的同学可以自己去看看,花不了多少功夫。
总的来说,EventBus提供了一个更优雅的代码解耦方式,你在实际工作中的业务中肯定能用得上它!
消息框架 EventBus 的实现原理
免费获取网络安全入门到进阶学习资源 点击此链接:网络安全入门到进阶全套G学习资源包免费分享! 事件总线(EventBus)的使用 EventBus 是用于 Android 的事件发布-订阅机制,简化了组件间通信,尤其是碎片间通信。它有三个关键角色:事件(Event)、订阅者(Subscriber)和发布者(Publisher)。事件可以是任意类型,订阅者处理事件,发布者发布事件,通常使用 `EventBus.getDefault().post(event)` 发布。EventBus 3.0 及以后版本允许自定义事件处理方法名,并通过 `@subscribe` 注解指定线程模型。 事件线程模型包括:POSTING:事件处理在发布事件的线程中。
MAIN:事件处理在主线程(UI)中,避免耗时操作。
BACKGROUND:事件处理在后台线程中,同样避免UI操作。
ASYNC:无论线程如何,事件处理始终在新线程中,UI操作受限。
使用 EventBus 的例子包括事件注册、发布与监听。 优先级控制在 `@subscribe` 中通过 `priority` 参数调整,影响事件处理顺序。`stopDelivery` 方法用于终止事件分发,确保优先级高的方法优先接收。 源码分析关注 EventBus 实例获取、注册、取消注册与事件触发过程。 网络安全成长路径 从基础技术学习到更高级别技能,网络安全学习路线分为多阶段。入门阶段掌握基本知识和工具,随后深入学习系统、网络、安全策略、编程语言等,最终提升至高级别威胁分析、安全策略设计和实施。 学习方法包括视频教程、实践练习和持续更新知识库。CSDN官方提供了免费的入门到进阶全套G学习资源包,涵盖理论、实践和案例分析。Android开发八大模块学习笔记,带你初探Android系统开发全貌
Android操作系统,自Andy Rubin开发以来,逐渐由Google收购并拓展至包括智能手机、平板电脑在内的多个领域,以其免费、智能和开放性在全球市场份额中占据重要地位。 Android系统庞大,学习内容繁杂,本文将通过八大模块深入讲解,旨在带领初学者全面了解Android系统架构及其运作机制,构建坚实的技术基础。架构师筑基必备技能
深入理解Java泛型
注解使用详解
并发编程实践
数据传输与序列化技术
Java虚拟机原理探索
高效IO操作
Android百大框架源码解析
Retrofit 2.0源码剖析
Okhttp3源码解读
ButterKnife源码解析
MPAndroidChart源码解析
Glide源码解析
Leakcanary源码分析
Universal-image-loader源码详解
EventBus 3.0源码解析
ZXing源码分析
Picasso源码解析
LottieAndroid使用详解与源码解析
Fresco源码分析——加载流程
Android性能优化实战解析
腾讯Bugly:深入理解字符串匹配算法
爱奇艺:安卓APP崩溃捕获方案
字节跳动:深入理解Gradle框架
百度APP技术:Android H5首屏优化实践
支付宝客户端架构解析:Android客户端启动速度优化
携程:组件化架构实践
网易新闻构建优化:构建速度提升策略
高级Kotlin强化实战
Kotlin入门教程
Kotlin实战避坑指南
项目实战《Kotlin Jetpack 实战》
Android高级UI开源框架进阶解密
SmartRefreshLayout使用与实践
Android PullToRefresh控件源码解析
Android-PullToRefresh下拉刷新库基本用法
LoadSir-高效易用的加载反馈页管理框架
Android通用LoadingView加载框架详解
MPAndroidChart实现LineChart(折线图)
hellocharts-android使用指南
SmartTable使用指南
开源项目android-uitableview介绍
ExcelPanel使用指南
Android开源项目SlidingMenu解析
MaterialDrawer使用指南
NDK模块开发
NDK模块开发入门
JNI模块实践
Native开发工具介绍
Linux编程基础
底层处理技术
音视频开发教程
机器学习应用入门
Flutter技术进阶
Flutter跨平台开发概览
Windows中Flutter开发环境搭建
编写Flutter APP实操
Flutter开发环境搭建与调试
Dart语法基础解析
Dart语法进阶与源码分析
微信小程序开发
小程序入门指南
小程序UI设计与实现
API操作详解
购物商场项目实战
本文内容涵盖Android系统架构、源码解析、性能优化、Kotlin强化、UI框架、NDK开发、Flutter技术、微信小程序等多个方面,旨在帮助初学者全面深入地了解Android系统开发全貌,构建坚实的技术栈。Vert.x 源码解析(4.x)——Context源码解析
Vert.x 4.x 源码深度解析:Context核心概念详解 Vert.x 通过Context这一核心机制,解决了多线程环境下的资源管理和状态维护难题。Context在异步编程中扮演着协调者角色,确保线程安全的资源访问和有序的异步操作。本文将深入剖析Context的源码结构,包括其接口设计、关键实现以及在Vert.x中的具体应用。Context源代码解析
Context接口定义了基础的事件处理功能,如立即执行和阻塞任务。ContextInternal扩展了Context,包含内部方法和功能,通常开发者无需直接接触,如获取当前线程的Context。在vertx的beginDispatch和endDispatch方法中,Context的切换策略取决于线程类型,Vertx线程会使用上下文切换,而非Vertx线程则依赖ThreadLocal。 ContextBase是ContextInternal的实现类,负责执行耗时任务,内部包含TaskQueue来管理任务顺序。WorkerContext和EventLoopContext分别对应工作线程和EventLoop线程的执行策略,它们通过execute()、runOnContext()和emit()方法处理任务,同时监控性能。 Context的创建和获取贯穿于Vert.x的生命周期,它在DeploymentManager的doDeploy方法中被调用,如NetServer和NetClient等组件的底层实现也依赖于Context来处理网络通信。额外说明
Context与线程并非直接绑定,而是根据场景动态管理。部署时创建新Context,非部署时优先获取Thread和ThreadLocal中的Context。当执行异步任务时,当前线程的Context会被暂时替换,任务完成后才恢复。源码中已加入详细注释,如需获取完整注释版本,可联系作者。 Context的重要性在于其在Vert.x的各个层面如服务器部署、EventBus通信中不可或缺,它负责维护线程同步与异步任务的执行顺序,是异步编程中不可或缺的基石。理解Context的实现,有助于更好地利用Vert.x进行高效开发。Androidå¼å-EventBus使ç¨è¯¦è§£
æ们大家å¨ä½¿ç¨EventBusçæ¶åï¼éè¦äºè§£ä»çé»è¾åçï¼ä¸å¿ äºè§£å®çæºç ï¼é£ä¹é«æ·±ãæ以æå°±å¨è¿éä¸è®²æºç äº!é¦å EventBusæ¯ä¸ä¸ªè®¢é è 模å¼ï¼ä¹å°±æ¯åæä»¬å ³æ³¨ä¸ä¸ªå¾®ä¿¡å ¬ä¼å·ä¸æ ·ï¼å ¬ä¼å·æ¯åæ¶æ¯è ï¼æä»¬å ³æ³¨è¯¥å ¬ä¼å·ç人就æ¯è®¢é ç人ï¼ä¹å°±æ¯æ¶æ¶æ¯çãå ¬ä¼å·åªè¦ä¸ææ°çæ¶æ¯æ¨éï¼æ们ç微信就ä¼å¼¹åºä¸æ¡å ¬ä¼å·æåçæ¶æ¯ï¼è¿å°±åEventBusé»è¾ä¸æ ·ã
é¦å æ们使ç¨EventBusæ¶éè¦æ³¨åï¼å ·ä½å¨ä»ä¹æ¶é´æ³¨åï¼æ ¹æ®èªå·±çéè¦å»æ³¨åï¼å¦æä¸æ³¨åï¼EventBuså°±æ æ³æ£å¸¸åéæ¶æ¯ï¼
æ¥æ¶è ä¹å°±æ æ³æ¥æ¶å°åéçæ¶æ¯ï¼æç项ç®æ¯ç¨EventBusä¼ å¼ï¼æ以æå°±åå¨Baseç±»ä¸äºï¼ä¸è¿ä½ 们ådemoçè¯å¯ä»¥åå¨onCreateä¸ã
EventBus注å
EventBusåæ¶æ³¨åï¼ä¸è¬æ们åå¨onDestroyä¸ï¼æè onStopä¸ï¼ä¸è¿æé½æ¯åå¨onDestroyä¸ï¼
æ£å¸¸ä½¿ç¨åéæ¶æ¯ï¼æè¿éçHomeFragmentRequest å°±æ¯ä¸ä¸ªBeanç±»ï¼æ们å¯ä»¥å®ä¹æ®éç±»åæ°æ®ï¼åªä¸è¿åéä»ä¹ç±»åï¼æ们就è¦ç¨ä»ä¹ç±»åå»æ¥æ¶
æ£å¸¸æ¥æ¶æ¶æ¯ï¼ä¹å°±æ¯æ¥æ¶åéè¿æ¥çæ¶æ¯(æ¹æ³åèªå®ä¹ï¼ä¸å®è¦ç¨åéè¿æ¥çæ°æ®ç±»å#å¿ é¡»å¸¦ä¸æ³¨è§£#)
ç²æ§äºä»¶çåéæ¹å¼
æ人çå°äºï¼æ¥ååæ®éæ¥åä¸æ ·åªä¸è¿å¨æ³¨è§£çåé¢å äºç¹ä½æ,è¿æ ·æ们就è½å¨å建åä¿åï¼å建ä¹å使ç¨ä¼ éè¿æ¥çæ°æ®å¦
Vert.x 源码解析(4.x)——Local EvnentBus入门使用和源码解析
Vert.x 源码解析(4.x)——Local EvnentBus入门使用和源码解析 本文将介绍使用和解析Vert.x的本地事件总线(Local EvnentBus)的基本概念、入门使用方法以及源码解析。1. 简介
Vert.x EventBus是一个用于异步通信的分布式事件总线,支持在同个Vert.x应用程序内部或跨多个Vert.x应用程序之间的消息交互,实现组件、模块或服务之间的松耦合与高度可扩展性。2. 基本概念
EventBus分为Local模式和Clustered模式,Local模式适用于项目内部通信,而Clustered模式用于集群间传输。3. 入门使用
3.1 获取EventBus
每个Vertx实例仅有一个EventBus实例,可使用注册处理器、调用consumer()方法获取MessageConsumer对象。 在集群模式下注册处理器时,注册信息传播至集群中所有节点可能需要时间。3.2 注销处理器
通过unregister方法注销处理器,在集群模式下,此动作传播至节点可能需要额外时间,可使用回调完成通知。3.3 发布消息
使用publish方法指定地址发布消息,消息将传递给所有在该地址注册的处理器。3.4 发送消息
使用send方法发送消息至指定地址的单个处理器。3.5 设置消息头
在发送或publish消息时可提供DeliveryOptions来设置头信息。3.6 消息顺序
消息按发送顺序传递给处理器。3.7 消息对象
消息处理器接收到的对象类型为Message,包含消息体和头信息。3.8 应答消息/发送回复
通过reply方法在处理器接收到消息后发送回复至消息来源,确认处理。3.9 带超时的发送
使用DeliveryOptions指定超时时间,若超时未收到回复,则调用应答处理器。3. 发送失败
消息发送失败时,应答处理器将接收到异常失败结果。3. 消息编解码器
注册消息编解码器支持发送任何对象,通过DeliveryOptions指定对象类型。3. 集群模式的Event Bus
将多个Vert.x实例组合为集群,实现分布式Event Bus。4. 关键类简介
4.1 主要类的作用
EventBus、EventBusInternal、EventBusImpl: EventBus接口定义方法,EventBusImpl实现管理消息、监听器注册、消息派发等功能,异步操作。 HandlerRegistration、MessageConsumerImpl: 消费者实现类,管理订阅关系与消息派发。 DeliveryContextBase、InboundDeliveryContext、OutboundDeliveryContext: 消息传递管理类,处理发送和接收过程。4.2 EventBus系列
EventBus、EventBusInternal: EventBus接口,EventBusImpl实现。4.3 MessageConsumer系列
MessageConsumerImpl实现消息消费与订阅管理。4.4 DeliveryContext系列
DeliveryContextBase管理消息传递过程,InboundDeliveryContext处理接收消息,OutboundDeliveryContext处理发送消息。4.5 Message系列
Message实现消息对象,MessageImpl具体实现。4.5.3 MessageCodec系列
CodecManager获取解码器,lookupCodec方法实现消息解码。5. Local模式EventBus源码解析
5.1 consumer方法分析
绑定时调用consumer方法,创建MessageConsumerImpl实例。5.2 handler
注册处理器,涉及HandlerRegistration、EventBusImpl等类。5.3 send
发送消息,EventBusImpl类实现,包括创建消息、发送上下文等。5.4 reply
回复消息,与send方法类似。5.5 总结
本地事件总线操作简单,消息发布与发送遵循明确的步骤。回复消息与发送类似,关键在于消息处理与应答机制。