1.深入理解 RxJava2:Scheduler(2)
2.Android架构师网络访问框架之Retrofit使用详细解析
3.有什么使用了rxjava或rxandroid的源码开源项目?
4.Hystrixä»ç»
5.RxJava3原理解析
深入理解 RxJava2:Scheduler(2)
欢迎来到深入理解 RxJava2 系列第二篇,本文基于 RxJava 2.2.0 正式版源码,解析将探讨 Scheduler 与 Worker 的源码概念及其实现原理。
Scheduler 与 Worker 在 RxJava2 中扮演着至关重要的解析角色,它们是源码线程调度的核心与基石。虽然 Scheduler 的解析百度网盘棋牌源码作用较为熟悉,但 Worker 的源码概念了解的人可能较少。为何在已有 Scheduler 的解析情况下,还要引入 Worker 的源码概念呢?让我们继续探讨。
首先,解析Scheduler 的源码核心定义是调度 Runnable,支持立即、解析延时和周期性调用。源码而 Worker 是解析任务的最小单元的载体。在 RxJava2 内部实现中,源码通常一个或多个 Worker 对应一个 ScheduledThreadPoolExecutor 对象,这里暂不深入探讨。
在 RxJava 1.x 中,Scheduler 没有 scheduleDirect/schedulePeriodicallyDirect 方法,只能先创建 Worker,再通过 Worker 来调度任务。这些方法是对 Worker 调度的简化,可以理解为创建一个只能调度一次任务的 Worker 并立即调度该任务。在 Scheduler 基类的源码中,默认实现是直接创建 Worker 并创建对应的 Task(虽然在部分 Scheduler 的覆盖实现上并没有创建 Worker,但可以认为存在虚拟的 Worker)。
一个 Scheduler 可以创建多个 Worker,文档下载类源码这两者是一对多的关系,而 Worker 与 Task 也是一对多的关系。Worker 的存在旨在确保两件事:统一调度 Runnable 和统一取消任务。例如,在 observeOn 操作符中,可以通过 Worker 来统一调度和取消一系列的 Runnable。
RxJava2 默认内置了多种 Scheduler 实现,适用于不同场景,这些 Scheduler 都可以在 Schedulers 类中直接获得。以下是两个常用 Scheduler 的源码分析:computation 和 io。
NewThreadWorker 在 computation、io 和 newThread 中都有涉及,下面简单了解一下这个类。NewThreadWorker 与 ScheduledThreadPoolExecutor 之间是一对一的关系,在构造函数中通过工厂方法创建一个 corePoolSize 为 1 的 ScheduledThreadPoolExecutor 对象并持有。
ScheduledThreadPoolExecutor 从 JDK1.5 开始存在,这个类继承于 ThreadPoolExecutor,支持立即、延时和周期性任务。但是注意,在 ScheduledThreadPoolExecutor 中,maximumPoolSize 参数是无效的,corePoolSize 表示最大线程数,且它的队列是无界的。这里不再深入探讨该类,否则会涉及太多内容。涛源码头钓鱼
有了这个类,RxJava2 在实现 Worker 时就站在了巨人的肩膀上,线程调度可以直接使用该类解决,唯一的麻烦之处就是封装一层 Disposable 的逻辑。
ComputationScheduler 是计算密集型的 Scheduler,其线程数与 CPU 核心数密切相关。当线程数远超过 CPU 核心数目时,CPU 的时间更多地损耗在了线程的上下文切换。因此,保持最大线程数与 CPU 核心数一致是比较通用的方式。
FixedSchedulerPool 可以看作是固定数量的真正 Worker 的缓存池。确定了 MAX_THREADS 后,在 ComputationScheduler 的构造函数中会创建 FixedSchedulerPool 对象,FixedSchedulerPool 内部会直接创建一个长度为 MAX_THREADS 的 PoolWorker 数组。PoolWorker 继承自 NewThreadWorker,但没有任何额外的代码。
PoolWorker 的使用方法是从池子里取一个 PoolWorker 并返回。但是需要注意,每个 Worker 是独立的,每个 Worker 内部的任务是绑定在这个 Worker 中的。如果按照上述方法暴露 PoolWorker,会出现两个问题:
为了解决上述问题,需要在 PoolWorker 外再包一层 EventLoopWorker。EventLoopWorker 是一个代理对象,它会将 Runnable 代理给 FixedSchedulerPool 中取到的 PoolWorker 来调度,并负责管理通过它创建的calec选股源码任务。当自身被取消时,会将创建的任务全部取消。
与 ComputationScheduler 恰恰相反,IoScheduler 的线程数是无上限的。这是因为 IO 设备的速度远低于 CPU 速度,在等待 IO 操作时,CPU 往往是闲置的。因此,应该创建更多的线程让 CPU 尽可能地利用。当然,并不是线程越多越好,线程数目膨胀到一定程度会影响 CPU 的效率,也会消耗大量的内存。在 IoScheduler 中,每个 Worker 在空置一段时间后就会被清除以控制线程的数目。
CachedWorkerPool 是一个变长并定期清理的 ThreadWorker 的缓存池,内部通过一个 ConcurrentLinkedQueue 维护。和 PoolWorker 类似,ThreadWorker 也是继承自 NewThreadWorker。仅仅是增加了一个 expirationTime 字段,用来标识这个 ThreadWorker 的超时时间。
在 CachedWorkerPool 初始化时,会传入 Worker 的超时时间,目前是写死的 秒。这个超时时间表示 ThreadWorker 闲置后最大存活时间(实际中不保证 秒时被回收)。
IoScheduler 中也存在一个 EventLoopWorker 类,收费网站源码资源它和 ComputationScheduler 中的作用类似。因为 CachedWorkerPool 是每隔 秒清理一次队列的,所以 ThreadWorker 的存活时间取决于入队的时机。如果一直没有被再次取出,其被实际清理的延迟在 - 秒之间。
熟悉线程的读者会发现,ComputationScheduler 与 IoScheduler 很像某些参数下的 ThreadPoolExecutor。它们对线程的控制外在表现很相似,但实际的线程执行对象不一样。这两者的对比有助于我们更深刻地理解 Scheduler 设计的内在逻辑。
Scheduler 是 RxJava 线程的核心概念,RxJava 基于此屏蔽了 Thread 相关的概念,只与 Scheduler/Worker/Runnable 打交道。
本来计划继续基于 Scheduler 和大家一起探讨 subscribeOn 与 observeOn,但考虑到篇幅问题,这些留待下篇分享。
感谢大家的阅读,欢迎关注笔者的公众号,可以第一时间获取更新,同时欢迎留言沟通。
Android架构师网络访问框架之Retrofit使用详细解析
Retrofit在Android开发中是常用的网络访问框架,它由Square开发,基于Java,提供类型安全的HTTP客户端。
Retrofit简化了在Android应用中的RESTful API请求过程,通过注解定义API端点和参数,使得开发者轻松创建和管理API请求。支持JSON、XML等数据格式,并自动使用如Gson或Jackson进行序列化。
Retrofit支持异步处理API调用,通过回调或RxJava Observables实现,避免阻塞主线程的UI操作。
Retrofit核心模块包含关键组件,其他辅助模块用于处理拦截器、请求头和参数等特定功能。源码结构清晰,易于理解和扩展。
Retrofit使用解析如下:
定义接口和处理响应结果即可,无需关注底层网络请求和数据解析。提供简洁API和丰富功能,简化网络请求开发。
可添加Gson转换器、RxJava适配器等依赖。更多网络学习参考《Android核心技术手册》。
Retrofit强大,简化网络请求,提高开发效率。封装请求逻辑,提高代码可维护性和复用性。利用注解、数据转换器等功能灵活处理不同需求。
综上,善用Retrofit技术,能高效进行网络请求开发。
有什么使用了rxjava或rxandroid的开源项目?
在探索使用了 RxJava 或 RxAndroid 的开源项目时,我们首先可以回顾 GitHub 上的官方资源:ReactiveX/RxJava。这个项目作为 RxJava 的源头,提供了核心库和文档,是学习 RxJava 的重要起点。值得一提的是,中国在 RxJava 领域有着优秀的贡献者,如@hi大头鬼hi,他的教程以其精准性和实用性,对众多学习者提供了巨大帮助。国内的开发者常常将翻译或撰写的资料先请大头鬼审校,可见其权威性之高。
接下来,我们聚焦到 Flipoard 的扔物线,他的开源库 MaterialEditText 和对 Dagger 源码的解析,都是深入 Android 开发领域的经典之作。虽然扔物线的教程现在可能不在公开博客中发布,但感兴趣的开发者依然可以通过搜索找到相关信息。
此外,yongjhih 这位台湾开发者同样值得推荐。作为 RxJava 的狂热爱好者,yongjhih 的 GitHub 上积累了丰富的 Examples,为学习者提供了实际操作的参考和灵感。
在寻找使用了 RxJava 或 RxAndroid 的项目时,上述提到的资源和开发者无疑是很好的起点。然而,阅读这些资料仅是学习的开始,更重要的是实践。动手编写 Demo,将 RxJava 与传统 Android 组件(如 Handler、AsyncTask、BroadcastReceiver 等)结合使用,可以显著加深理解。不断练习,相信自己能够掌握,是学习过程中的关键。
在这个领域,持续探索、实践和分享是推动技术进步的重要力量。无论是从官方文档开始,还是追随这些知名开发者的学习路径,最终的目标是将理论知识转化为实际能力,解决实际问题。在这个过程中,不断尝试、总结和反思,将带来最大的成长。通过实践和交流,我们可以更加深入地理解 RxJava 或 RxAndroid 的应用场景,从而在项目中发挥它们的独特优势。
Hystrixä»ç»
对Hystrixè³é»å·²ä¹ ï¼æè¿å好æ³å¨é¡¹ç®ä¸ä½¿ç¨è¿ä¸ªç¥å¨å°±é¡ºå¸¦ç 究äºä¸æï¼å¾å¤ç»èæ¥ä¸åæ·±å ¥ç 究åªè½æå®è§ä¸çå个æ¦å¿µè®²è§£ä¸ä¸ï¼è¿ä¸ªä»ç»çç´ æ大é½æ¥èªgithubä¸çHystrixå®ç½ã
æè°ä¸å¾èåè¨ï¼ä½å¡è½å¤ç¨å¾çæ¥è¡¨ç¤ºèä¸è½å¤è¡¨ç¤ºæ¸ æ¥çï¼å°±ä¸å¤ç¨æåæè¿°äºï¼çå¾è¯å®æ¯çæåè¦è®©äººæ¥çæ´ç½ä¸äºãå½ç¶æè¿æ¯é常建议å»githubä¸çHystrixå®æ¹wikiå»çåæ±åå³çææ¡£ï¼å¨åèæç®é¨åå·²ç»ç»åºäºé¾æ¥ã
æåæä¸ç¹ï¼å°±æ¯å¨Hystrixçå®ç°å½ä¸å¤§é使ç¨äºRxJavaçå¼æºå çææ¯ï¼è¿ä¸ªææ¯ä¹å没æä¹ç 究è¿ï¼æ以åé¢çå¾å¤æºç çåææ´å¤ä¾§éè¿ç¨åæèä¸ä¼æ·±å ¥ç»èï¼æå ´è¶£çå¯ä»¥èªå·±æ·±å ¥ç 究ä¸ï¼æå°±åå¤åªå¤©å¾ç©ºå¥½å¥½å»ç 究ä¸ä¸ï¼æ¯ç«RxJavaè¿ä¸ªä¸è¥¿å·ç§°æ¯ä¸ä¸ªéè¿ä½¿ç¨å¯è§å¯åºåæ¥ç¼åå¼æ¥ååºäºäºä»¶çç¨åºçåºã
hystrixçåºç°å³ä¸ºè§£å³éªå´©æåºï¼å®éè¿å个æ¹é¢çæºå¶æ¥è§£å³è¿ä¸ªé®é¢
Hystrixçé离主è¦æ¯ä¸ºæ¯ä¸ªä¾èµç»ä»¶æä¾ä¸ä¸ªé离ç线ç¨ç¯å¢ï¼æä¾ä¸¤ç§æ¨¡å¼çé离ï¼
Hystrixççæå¨å ¶å®å¯ä»¥ç解为就æ¯ä¸ä¸ªç»è®¡ä¸å¿ï¼ç»è®¡ä¸å®æ¶é´çªå£å 访é®æ¬¡æ°ï¼æå次æ°ï¼å¤±è´¥æ¬¡æ°çæ°å¼å¤å®æ¯å¦åççæãåççµè·¯çæçè¿ç¨å¦ä¸ï¼
hystrixå·¥ä½åç-è±æç
hystrixå·¥ä½åç-ä¸æç
å ³äºRxJavaç详解
RxJava3原理解析
RxJava3是一个用于构建异步和基于事件的程序的强大工具,官方定义为Java VM上的可观测序列库。本文以3.0.版本的源码为例,从基础使用开始,讲解如何与Retrofit结合,实现网络请求的链式操作。
首先,我们通过一个简单的示例来演示如何构建Retrofit实例,定义API并发起网络请求,从而利用RxJava的链式操作。
接着,我们从基础的just操作符开始理解订阅关系。Single.just(1)创建了一个SingleJust实例,RxJava的订阅过程主要由subscribeActual方法控制。SingleJust在实际订阅时,直接回调观察者的onSubscribe和onSuccess,没有错误处理,因为数据不包含失败状态。
然后,我们探讨map操作符,它用于数据转换。map的实现是通过构建SingleMap,其订阅过程与just类似,只是将上游的数据通过map操作进行转换后再传递给下游的观察者。
框架结构方面,RxJava以操作符(如map)为核心,它们通过dispose方法来控制工作流程。dispose有多种情况,理解这些情况有助于更好地控制程序的执行。
对于无后续操作的Single.just,如无延迟,dispose操作相对简单,因为任务很快完成。而Observable.interval和Single.delay则涉及后续任务和延迟,它们通过Disposable和调度器管理任务的执行和取消。
线程切换是RxJava的关键功能,subscribeOn和observeOn分别用于指定操作的线程。例如,SingleSubscribeOn用于指定订阅操作的线程,而ObserveOnSingleObserver则在指定线程中执行观察者的方法。
最后,Scheduler是控制线程执行的关键,如Schedulers.newThread、Schedulers.io和AndroidSchedulers.mainThread各有其用途。RxJava的这些核心特性使得它在Android开发中广泛应用,特别是处理异步操作和线程切换。