Android Retrofit 源码解析

news/2024/12/29 2:11:16/

在 Android 开发中,Retrofit 是一个非常流行的网络请求库。它是由 Square 开发的,用于简化 Android 应用程序与网络服务器之间的通信

Retrofit 主要用于处理 RESTful API 的网络请求。它通过将 HTTP 请求与 Java 接口方法进行映射,使得网络请求的编写变得简单和直观。使用 Retrofit,开发者可以定义一个描述网络请求的接口,然后通过注解将请求的URL、请求方法、请求参数等信息与接口方法绑定起来。Retrofit 会处理底层的网络请求和数据解析,开发者只需要关注业务逻辑的实现。


Retrofit 的使用:

        // retrofit 初始化retrofit = new Retrofit.Builder().baseUrl("https://www.wanandroid.com/").addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(GsonConverterFactory.create(new Gson())).build();// 创建接口服务INetService iNetService = retrofit.create(INetService.class);// 进行网络请求iNetService.someThingCall().enqueue(new Callback<Bean>() {@Overridepublic void onResponse(Call<Bean> call, Response<Bean> response) {}@Overridepublic void onFailure(Call<Bean> call, Throwable t) { }});// 服务接口
interface INetService {Call<Bean> someThingCall();
}

这就是 Retrofit 的一个常规使用,先初始化,接着创建接口服务,接着就可以进行网络请求了,可以说比 Okhttp 简洁非常多。关键就是 Retrofit.create() 这个方法,里面做了非常多的事


package retrofit2;public final class Retrofit {public <T> T create(final Class<T> service) {validateServiceInterface(service); // 验证接口类return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] {service},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// ....return platform.isDefaultMethod(method)? platform.invokeDefaultMethod(method, service, proxy, args): loadServiceMethod(method).invoke(args);}});}
}

可以看到,create 方法中使用了动态代理,返回的是 loadServiceMethod(method).invoke(args);

加载服务方法然后去执行,先看 loadServiceMethod:


  ServiceMethod<?> loadServiceMethod(Method method) {ServiceMethod<?> result = serviceMethodCache.get(method); // 先从缓存中取if (result != null) return result;synchronized (serviceMethodCache) {result = serviceMethodCache.get(method);if (result == null) {result = ServiceMethod.parseAnnotations(this, method);serviceMethodCache.put(method, result);}}return result;}

会先从缓存中取,若没有缓存则调用 ServiceMethod.parseAnnotations():


package retrofit2;abstract class ServiceMethod<T> {static <T> ServiceMethod<T> parseAnnotations(Retrofit retrofit, Method method) {RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method);Type returnType = method.getGenericReturnType();// ... 对返回类型做判断return HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory);}
}

这个静态方法主要是对返回类型做判断,收集请求相关的信息整理到 requestFactory 这个对象当中,再调用 HttpServiceMethod.parseAnnotations() :


package retrofit2;abstract class HttpServiceMethod<ResponseT, ReturnT> extends ServiceMethod<ReturnT> {static <ResponseT, ReturnT> HttpServiceMethod<ResponseT, ReturnT> parseAnnotations(Retrofit retrofit, Method method, RequestFactory requestFactory) {boolean isKotlinSuspendFunction = requestFactory.isKotlinSuspendFunction;Annotation[] annotations = method.getAnnotations();Type adapterType;if (isKotlinSuspendFunction) {// Kotlin 协程相关} else {adapterType = method.getGenericReturnType();}// 从 retrofit 中获取请求适配器CallAdapter<ResponseT, ReturnT> callAdapter =createCallAdapter(retrofit, method, adapterType, annotations); // 从 retrofit 中获取响应转换器Converter<ResponseBody, ResponseT> responseConverter =createResponseConverter(retrofit, method, responseType); okhttp3.Call.Factory callFactory = retrofit.callFactory;if (!isKotlinSuspendFunction) {return new CallAdapted<>(requestFactory, callFactory, responseConverter, callAdapter);} else {// Kotlin 协程相关}}}

最终,Retrofit.create() 方法中的 loadServiceMethod() 返回的是一个具有请求信息、okhttp 的请求工厂、响应转换器和请求适配器的 CallAdapted


接着,调用 loadServiceMethod().invoke():

package retrofit2;abstract class HttpServiceMethod<ResponseT, ReturnT> extends ServiceMethod<ReturnT> {@Overridefinal @Nullable ReturnT invoke(Object[] args) {// 创建能够进行网络请求的 CallCall<ResponseT> call = new OkHttpCall<>(requestFactory, args, callFactory, responseConverter);return adapt(call, args);}}

此时,会将之前的所有请求相关的参数,条件都封装到具有网络请求功能的 OkHttpCall,然后和请求参数一起适配到之前的适配器当中。


最终,返回的 Call 是 DefaultCallAdapterFactory.ExecutorCallbackCall:

package retrofit2;final class DefaultCallAdapterFactory extends CallAdapter.Factory {static final class ExecutorCallbackCall<T> implements Call<T> {final Executor callbackExecutor; // 这个是用来切换主线程的final Call<T> delegate; // 这个就是 OkHttpCallExecutorCallbackCall(Executor callbackExecutor, Call<T> delegate) {this.callbackExecutor = callbackExecutor;this.delegate = delegate;}@Overridepublic void enqueue(final Callback<T> callback) {  // 异步请求delegate.enqueue(new Callback<T>() {@Overridepublic void onResponse(Call<T> call, final Response<T> response) {callbackExecutor.execute(() -> {if (delegate.isCanceled()) {callback.onFailure(ExecutorCallbackCall.this, new IOException("Canceled"));} else {callback.onResponse(ExecutorCallbackCall.this, response);}});}@Overridepublic void onFailure(Call<T> call, final Throwable t) {callbackExecutor.execute(() -> callback.onFailure(ExecutorCallbackCall.this, t));}});}@Overridepublic Response<T> execute() throws IOException {  // 同步请求return delegate.execute();}}
}

总的来说,Retrofit是一个功能强大、易于使用的网络请求库,它简化了安卓应用程序与服务器之间的通信,提供了方便的接口定义和数据解析功能,是安卓开发中常用的网络请求工具之一。


http://www.ppmy.cn/news/771287.html

相关文章

Unity与iOS交互(1)——需要了解的IOS相关知识

【前言】 以下只是简要介绍&#xff0c;详细的内容需要自己去看链接 【Objective-C基础知识】 .h .m .mm .cpp文件区别 .h是头文件扩展名。头文件包含类&#xff0c;类型&#xff0c;函数和常数的声明&#xff0c;这里的定义一般是Public的 .m是实现文件扩展名。其包含源代…

【爬虫】AOI

目前几个大厂&#xff0c;高德百度腾讯&#xff0c;都支持POI爬取&#xff0c;而AOI是需要自己找接口的。 换言之&#xff0c;爬虫需谨慎 1 百度AOI 参考链接是&#xff1a; 这两个链接是选定范围爬取范围内选定类别的AOI 黑科技 | 百度地图抓取地块功能&#xff08;上&#x…

【架构设计】架构知识体系

文章目录 1、什么是架构和架构本质2、架构分类2.1、业务架构&#xff08;俯视架构&#xff09;2.2、应用架构&#xff08;剖面架构&#xff0c;也叫逻辑架构图&#xff09;2.2.1、职责划分: 明确应用&#xff08;各个逻辑模块或者子系统&#xff09;边界2.2.2、职责之间的协作&…

win系统删除oracle数据文件恢复---惜分飞

有客户联系我们,说win平台下的数据库,在由于空间紧张,在关闭数据库的情况下删除的两个数据文件,导致数据库无法正常访问很多业务表,需要对其进行恢复,查看alert日志发现大概操作,删除文件之后,启动数据库失败 Completed: alter database mount exclusive alter database open E…

比亚迪一季度营收超1200亿元,净利增4倍超越2021年全年---转自百度新闻|澎湃新闻

比亚迪汽车 视觉中国资料图比亚迪今年第一季度的净利润超过了2021年全年净利润。4月27日&#xff0c;比亚迪股份有限公司&#xff08;比亚迪&#xff0c;002594.SZ&#xff0c;01211.HK&#xff09;披露2023年第一季度财报。财报显示&#xff0c;比亚迪在第一季度实现营业收入1…

尹同跃捧走2022中国汽车年度人物;比亚迪当选2022最佳中国品牌汽车企业 | 美通社头条...

美通社消息&#xff1a;12月8日&#xff0c;由21世纪经济报道、中国汽车金融主办&#xff0c;以“数智驱动未来”为主题的“2022中国汽车产业峰会”线上论坛圆满落幕。当天&#xff0c;“21世纪汽车产业竞争力研究「金引擎」案例&#xff08;2022&#xff09;”隆重揭晓&#x…

2023上海车展首日15款重磅新车,新能源汽车成绝对主角

来源&#xff1a;第一电动汽车网 4月18日&#xff0c;第十二届上海车展正式开幕。作为疫情后国内的首个A级车展&#xff0c;上海车展上的重磅新车早已吊足了大家的胃口。 在本届车展上&#xff0c;有承载着“全村的希望”的小鹏G6、改款蔚来ES6&#xff0c;有早已博眼球许久的银…

电动汽车发展技术

桂林航天工业学院 课程论文 课程名称 : 新能源汽车技术 开课学期 : 2022—2023学年第二学期 专业班级 : 2020汽车服务工程 1 班 论文题目 : 电动汽车充电技术的发展 姓名 : 韦乐乐 学号 : 20200512B0101 任课老师 : 刘路 2023年6月20日 目录 一、 电动汽车…