1.Retrofit2.9.0源码解析
2.舒服了!源码Kotlin协程优雅的源码与Retrofit缠绵
3.还在用Feign?推荐一款微服务间调用神器,跟SpringCloud绝配!源码
4.「Android技术汇」Retrofit2 源码解析和案例说明
5.Retrofit 源码解析
6.RxJava3原理解析
Retrofit2.9.0源码解析
前言 之前我们探讨了OkHttp的源码基本原理,这款以高效的源码线程池设计、任务分配与转化以及基于责任链模式的源码zip 源码 解压五大全拦截器而深受开发者喜爱的库,却在引入时需要进行封装,源码以适应主、源码子线程的源码切换与返回值的转换。面对团队成员的源码偏好,选择Retrofit作为解决方案,源码无疑提升了团队协作的源码友好性。接下来,源码我们将深度剖析这个优秀的源码开源框架是如何促进团队合作的。 使用 以下代码摘自Retrofit的源码官方示例,除了线程管理部分,其余部分基本相同,可以直接在Android Studio项目中运行。Retrofit的使用方式相对直观,但在此不再赘述,直接进入源码解析。 Retrofit的封装模式在于为OkHttp提供了一层更友好的调用方式,实质上仍依赖OkHttp执行网络请求。正如一把剑,除了锋利的刃之外,剑柄、剑鞘和符咒共同决定了它的使用体验。Retrofit与OkHttp的关系图展示了它们之间的爱恨纠葛。 Retrofit.build()方法详解 在Retrofit构建实例的过程中,以下关键步骤被实现:判断并设置baseUrl。
赋值callFactory,即OkHttp客户端。
若未指定callFactory,则默认使用OkHttpClient。
设置callbackExecutor,用于线程切换。
赋值callAdapterFactories,用于处理网络请求的转换。
其中,callbackExecutor的默认值是Android平台的MainThreadExecutor,确保了执行方法后线程切换至主线程。callAdapterFactories是一个工厂模式的列表,用于创建不同的callAdapter,以处理网络请求的关键步骤(enqueue、execute)。 在Android平台下,defaultCallbackExecutor被构造为MainThreadExecutor的实例,通过Handler与Looper的关联确保了线程切换。 最后,我们了解了converterFactories的作用,这是负责服务端返回值转换的关键组件。 Retrofit.create()方法解析 在调用Retrofit.create()方法时,动态代理(Proxy.newProxyInstance)发挥关键作用。源码接单平台这个过程类比于N女士委托X律师处理问题,动态代理将实体方法的调用转化为OkHttp请求的执行。 动态代理通过反射机制,实现所有请求的统一处理,简化了接口的使用,同时增强了功能。尽管它可能导致性能损耗,但Retrofit的高效与强大使其成为众多开发者的首选。 代理执行的关键步骤包括:明确动态代理概念。
理解invoke()方法的执行时机。
分析github(代理).contributors方法的执行流程。
通过动态代理,Retrofit实现了对网络请求的封装,简化了开发过程,并提供了灵活的适配性。最终,请求通过OkHttp客户端执行,返回值通过适配器转换为预期格式。 生成Call与执行网络请求 在生成Call后,执行network request的过程由OkHttp客户端负责。在Retrofit的实现中,Call的创建与执行紧密相连,最终通过OkHttp的Call.execute()方法完成网络请求的执行。 结语 撰写源码解析的过程不仅加深了对Retrofit的理解,也揭示了其作为团队协作工具的潜力。通过阅读优秀源码,开发者可以不断提升自我,学习到更深层次的知识与技能。Retrofit以其简洁、高效的设计,为开发者提供了强大的网络请求支持,成为了Android开发中的重要组件。源码的探索之旅,既是一次技术的修炼,也是对开源精神的致敬。舒服了!Kotlin协程优雅的与Retrofit缠绵
Kotlin已成为Android开发的Google推荐语言,项目已长时间使用Kotlin。Kotlin 1.3发布后,Kotlin协程已稳定,引发了一些思考。
对于网络请求功能,我们一直在思考如何编写优雅、简洁、快速、安全的代码。这也是许多开发者持续思考的问题。由于我们项目使用Retrofit作为网络库,因此所有思考都基于Retrofit展开。
本文将从我的思考历程开始,涉及Kotlin协程、扩展方法、汇聚漫画源码DSL等。没有基础的小伙伴,请先了解这三样东西。关于DSL,可以参考我写的简介。
网络请求中,我们需要关注页面生命周期的绑定,关闭页面时需关闭未完成的网络请求。前辈们为此各显神通。我也是从学习、模仿前辈,到自我理解的转变。
最初使用Callback异步方法是Retrofit最基本的使用方式。在关闭网络请求时,需要在onDestroy中调用cancel方法。这种方式容易导致忘记调用cancel方法,且网络操作和关闭请求的操作分开,不利于管理。
随着Rx的火爆,我们项目的网络请求方式也逐渐转为Rx。在Rx的使用中,我们尝试了各种封装方式,如自定义Subscriber,将onNext、onCompleted、onError进行拆分组合,满足不同需求。
在Retrofit中添加Rx转换器RxJava2CallAdapterFactory.create(),将接口的Call改为Observable。使用方式如下,配合RxAndroid绑定声明周期。这种使用方式方便了许多,响应式编程的思想也很优秀,一切皆为事件流。通过RxAndroid切换UI线程和绑定页面生命周期,页面关闭时自动切断向下传递的事件流。
RxJava最大的风险在于内存泄露,而RxAndroid确实规避了一定的泄露风险。通过查看RxJava2CallAdapterFactory的源码,发现确实调用了cancel方法,貌似不错。但总觉得RxJava过于庞大,有些大材小用。
随着项目推进和Google全家桶发布,轻量化版本的RxJava进入我们的视线,那就是LiveData。LiveData借鉴了很多RxJava的设计思想,属于响应式编程范畴。LiveData的最大优势在于响应Activity的生命周期,无需像RxJava那样绑定声明周期。
首先需要添加LiveDataCallAdapterFactory,用于将Retrofit的stl核心源码Callback转换为LiveData。接口改为,调用方法如下。在项目中使用时,通常会自定义Observer,用于区分各种数据。
在调用observe方法时,传递this,指的是声明周期。一般我们在AppCompatActivity中使用时,直接传递其本身即可。通过查看源码可以发现,this本身是传递的LifecycleOwner。在层层跳转AppCompatActivity时,会发现AppCompatActivity继承于SupportActivity的父类,实现了LifecycleOwner接口。一般只需传递其本身即可。LiveData会自动处理数据流的监听和解除绑定。
在onCreate中对数据进行一次性的绑定,后面就不需要再次绑定了。当生命周期走到onStart和onResume时,LiveData会自动接收事件流;当页面处于不活动时,会暂停接收事件流,页面恢复时恢复数据接收。当页面onDestroy时,会自动删除观察者,从而中断事件流。
可以看出LiveData作为官方套件,使用简单,生命周期的响应也很智能,一般都不需要额外处理了。更高级的用法可以参考官方Demo,可以对数据库缓存等待进行一整套响应式封装,非常不错。建议学习官方的封装思想,就算不用,也是对自己大有裨益。
上面说了那么多,这里步入正题。大家仔细观察会发现,上面均是使用Retrofit的enqueue异步方法,再使用Callback进行网络回调,就算是RxJava和LiveData转换器,内部其实也是使用的Callback。在此之前,Retrofit的作者也写了一个协程的转换器,但内部依然使用的是Callback,本质相同。Retrofit有同步和异步两种调用方式。上面这就是异步调用方式,传入一个Callback,这也是我们最常用到的方式。
上面这种是龙头辈出源码同步调用方法,会阻塞线程,返回的直接就是网络数据Response,很少使用。后来我就在思考,能不能结合Kotlin的协程,抛弃Callback,直接使用Retrofit的同步方法,把异步当同步写,代码顺序书写,逻辑清晰,效率高,同步的写法更方便对象的管理。
首先写一个协程的扩展方法,上面就是核心代码,主要的意思都写了注释。整个工作流程是出于UI协程中,所以可以随意操作UI控件,接着在IO线程中去同步调用网络请求,并等待IO线程执行完毕,接着再拿到结果进行处理,整个流程都是基于同步代码的书写方式,一步一个流程,没有回掉导致的代码割裂感。那么继续,我们想办法把获取的数据返回出去。
这里我们采用DSL方法,首先自定义一个类,此类对外暴露了三个方法:onSuccess、onComplete、onFailed,用于分类返回数据。接着,我们对核心代码进行改造,将方法进行传递。这里使用DSL传递方法,可以更具需要传递的,例如只需要onSuccess,那就只传递这一个方法,不必三个都传递,按需使用。
使用方式如下,首先需要按照Kotlin的官方文档改造下Activity,Activity实现CoroutineScope接口,就能直接根据当前的context获取协程使用。接下来就是真正的使用,在任意位置即可调用此扩展方法。在有的时候,我们只需要处理onSuccess的情况,并不关心其他两个。那么直接写:需要哪个写哪个,代码非常整洁。
可以看出,我们不需要单独再对网络请求进行生命周期的绑定,在页面被销毁的时候,job也就被关闭了,当协程被关闭后,会执行调用Retrofit的cancel方法关闭网络。
协程的开销小于Thread多线程,响应速度很快,非常适合轻量化的工作流程。对于协程的使用,还有更多深入的思考和学习。协程并不是Thread的替代品,而是多异步任务的一个补充,我们不能按照惯性思维去理解协程,而是要多从其本身特性入手,开发出它更安逸的使用方式。而且随着Retrofit 2.6.0的发布,自带了新的协程方案,增加了suspend挂起函数的支持,可见协程的应用会越来越受欢迎。
上面所说的所有网络处理方法,不论是Rx还是LiveData,都是很好的封装方式,技术没有好坏之分。我的协程封装方式也许不是最好的,但是我们不能缺乏思考、探索、实践三要素,去想去做。
还在用Feign?推荐一款微服务间调用神器,跟SpringCloud绝配!
在微服务架构中,Feign是常见的服务间调用工具。然而,一款名为Retrofit的HTTP客户端工具,搭配SpringCloud使用效果更佳。Retrofit不仅支持常规HTTP调用,还具备负载均衡和熔断限流功能,特别适合微服务间的交互。本文将详细介绍Retrofit在Spring Cloud Alibaba中的应用,包括与Nacos和Sentinel的整合,对这些技术不熟悉的读者可以先回顾相关教程。
以SpringBoot实战项目mall(k+star)为例,首先需要搭建Nacos和Sentinel,并准备一个可供调用的nacos-user-service服务。接下来,我们将逐步展示Retrofit的基本操作,包括服务间调用、服务限流和熔断降级的配置。
相较于Feign,Retrofit通过提供一个更加优雅的HTTP调用接口,降低了接口实现方和调用方之间的耦合度。使用Retrofit,调用方无需重复实现接口,大大简化了开发流程。无论是在单体应用还是微服务环境中,Retrofit都展现出强大的适应性。
如果你对Retrofit感兴趣,可以参考官方文档进行深入学习:github.com/LianjiaTech/...,同时项目源码地址也在:github.com/macrozheng/s...
「Android技术汇」Retrofit2 源码解析和案例说明
各位好!小魔王同学给您带来一篇技术文章 —— Retrofit2的源码解析。由峰瑞资本技术团队的Android小牛“大白”撰写,小魔王同学负责修改和润色。文章旨在深入理解Retrofit2这一由Square贡献的Android界四大神器之一,帮助开发者更高效地进行网络请求。 Retrofit2是一个基于OkHttp的RESTFUL API请求工具,相比Google的Volley,Retrofit在设计上更加简洁优雅,更适合构建Android应用。它的使用方式非常直观,只需调用Java方法,即可实现HTTP请求。 文章分为四大部分,旨在全面解析Retrofit2的原理、用法和源码。1. Retrofit2是什么
Retrofit2是一个强大的HTTP客户端,它使得开发者能够以一种类型安全、简洁的方式,实现RESTful API的调用。其设计思路独特,代码量极少,深入研究其源码能够大大提升对网络请求的理解与实践能力。2. Retrofit2如何使用
使用Retrofit2,首先创建Retrofit对象并指定API域名,接着定义Java接口描述API,使用Retrofit对象生成接口实例。通过接口实例调用API即可获取数据。这种调用方式极大地简化了HTTP请求的编写,使得代码更加易读且易于维护。3. Retrofit2的原理
Retrofit2通过Java动态代理将描述的API方法转化为HTTP请求。具体来说,Retrofit创建一个代理对象,拦截调用并解析注解,生成请求参数,最终由OkHttp执行网络请求。这一过程使得Retrofit2能够灵活地处理各种API请求。4. Retrofit2源码分析
Retrofit2的源码结构清晰,主要包含Retrofit接口、Callback、Converter、Call、CallAdapter等组件。这些组件相互协作,实现了从API描述到HTTP请求的转换。 Retrofit2在运行时通过动态代理将API调用转化为请求,再通过OkHttp执行网络操作。通过解析注解信息,Retrofit2能够生成请求参数、方法、路径等信息,最终返回一个Call对象,用于执行网络请求。总结
Retrofit2通过注解描述API接口,动态代理执行请求,结合OkHttp高效执行网络操作。其简洁、高效的设计使得Retrofit2成为构建Android应用时处理HTTP请求的首选工具。深入理解Retrofit2的原理与源码,将极大地提升开发者在构建网络服务时的灵活性与效率。 感谢开源社区提供的宝贵资源,让我们有机会学习和理解像Picasso和Retrofit这样的优秀项目。学习这些项目不仅能够提升编程技巧,更能够深入理解面向接口编程的精髓。Retrofit 源码解析
Retrofit源码深入解析,我们将通过构建过程逐步揭示其工作原理。
首先,从Builder的无参构造开始,它会创建一个Platform对象,对于Android环境,会选择Android内部类。接着,Builder的build方法主要负责构建Retrofit对象,包括CallFactory、CallAdapter.Factory和Converter.Factory。如图所示,这些组件在后续的网络请求中发挥关键作用。
CallAdapter.Factory中,我们重点关注ExecutorCallAdapterFactory,它在接口实例化时起到关键作用。当你通过retrofit.create创建接口实例时,动态代理模式开始发挥作用,通过获取接口方法的返回类型来适配网络请求。
调用接口方法时,如ihttp.post(),实际执行的是proxy.invoke()和serviceMethod.invoke()的组合,这里HttpServiceMethod的构造函数接受的是Builder对象,与Retrofit的构造者模式有别。
如果你使用异步请求,调用enqueue方法,会创建OkHttpCall对象,OkHttpClient作为callFactory,负责解析自定义方法和参数注解。最终,通过OkHttpCall的enqueue方法执行网络请求,并通过ExecutorCallbackCall的回调机制处理响应结果。
至此,Retrofit的整个请求流程得以清晰展示。理解了这些核心组件和步骤,你就能更好地掌握Retrofit的运作机制了。
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开发中广泛应用,特别是处理异步操作和线程切换。
okhttp,retrofit,android-async-http,volley应该选择哪一
在选择OkHttp, Retrofit, Android-Async-Http, Volley时,重要的是理解它们的功能定位。OkHttp是基于HTTP协议封装的请求客户端,主要负责真正的请求过程,类似于HttpClient和HttpURLConnection,而Volley, Retrofit, Android-Async-Http则封装了请求、线程切换和数据转换。以下是从不同角度对这四个框架的比较分析。
首先,即使只使用OkHttp,你仍需要一层封装,使得功能与Volley等框架相似,只是封装的优劣不同。Android-Async-Http内部使用了HttpClient,尽管在Android 6.0后HttpClient不再是系统自带组件,但在更新中被复制,因此仍可使用。Volley是官方推荐的框架,设计时封装了请求客户端(HurlStack),支持HttpUrlConnection、HttpClient和OkHttp,提供了解耦和灵活切换的便利性。如果你习惯Volley,可轻松扩展至使用OkHttp。
Retrofit由Square开发,拥有高度解耦设计,通过注解配置请求参数,使用工厂生成CallAdapter、Converter等组件,支持多种请求适配器和反序列化工具。这种设计模式炒鸡解耦,是一个经典的学习案例。性能上,取决于OkHttp的性能,与封装工具关联不大。
关于RxJava,建议在充分理解其原理后使用,确保团队中有精通者,以防遇到问题。选择开源库的标准是:最适合项目需求、大多数人使用、操作简便。
额外提及,选择开源框架时,可以参考相关资源,如作者的简书文章,进行决策。Retrofit源码分析和流程图提供了清晰的解耦设计模式示例,是难得的学习资源。