Retrofit2原理分析

Retrofit官网

GitHub上的Retrofit

使用Retrofit进行网络请求的主要步骤
  1. 创建一个接口
    用于描述HTTP请求。接口里的方法使用注解来标记请求方式、API路径、请求参数等信息。
  2. 使用Retrofit.Builder().build();配置和创建一个Retrofit实例;
  3. 调用retrofit.create()方法获取请求接口实例;
  4. 由请求接口实例获取到Call对象;
  5. 进行网络请求(同步/异步)

接口 APIService.java代码

package example.demo.testandroidx.http;import example.demo.testandroidx.base.BaseResponse;
import example.demo.testandroidx.entity.LoginRequset;
import io.reactivex.rxjava3.core.Observable;
import okhttp3.ResponseBody;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;public interface APIService {/*登录接口用POST方式发起请求请求参数用Body对象传入*/@POST(HttpsUrl.LOGIN)Observable<BaseResponse<String>> login(@Body LoginRequset loginRequset);/*获取文章信息接口用GET方式发起请求*/@GET("wxarticle/chapters/json")Observable<ResponseBody> getContent();
}

封装RetrofitHelper.java代码

public class RetrofitHelper {public static volatile APIService sAPIService;private static final int DEFAULT_TIMEOUT = 20; // 20  SECONDSprivate static final int DEFAULT_READ_TIMEOUT = 30; // 20  SECONDSpublic static APIService createAPIService() {if (sAPIService == null) {synchronized (RetrofitHelper.class) {Retrofit retrofit = new Retrofit.Builder().baseUrl(HttpsUrl.BASE_URL).client(getOkHttpClient()).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava3CallAdapterFactory.create()).build();/*https://blog.csdn.net/hu582205/article/details/108800768Unable to create call adapter for io.reactivex.rxjava3.core.Observable*/sAPIService = retrofit.create(APIService.class);}}return sAPIService;}public static OkHttpClient getOkHttpClient() {OkHttpClient.Builder builder = new OkHttpClient.Builder();builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS).readTimeout(DEFAULT_READ_TIMEOUT, TimeUnit.SECONDS).writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS).cookieJar(new CustomCookieJar()).addInterceptor(new TokenInterceptor()).addInterceptor(new PublicParamInterceptor());if (BuildConfig.DEBUG) {HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);builder.addInterceptor(httpLoggingInterceptor);}return builder.build();}
}

Retrofit.java里的create 方法

通过调用retrofit.create(APIService.class);获取请求接口APIService的实例
在这里插入图片描述

Retrofit.java里的loadServiceMethod 方法

在这里插入图片描述

ServiceMethod.java代码

ServiceMethod类负责解析接口方法的注解信息,并构建请求对象
在这里插入图片描述

RequestFactory.java里的parseAnnotations方法

在这里插入图片描述

RequestFactory.java里Builder内部类里的parseMethodAnnotation方法
在这里插入图片描述

HttpServiceMethod.java里的parseAnnotations方法

parseAnnotations()
作用:解析注解信息,并创建CallAdapter和Converter,最终返回CallAdapted类型的ServiceMethod实例。
在这里插入图片描述

HttpServiceMethod.java里的invoke方法

在这里插入图片描述
在这里插入图片描述

RxJava3CallAdapter.java里的adapt方法

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/485036.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

堆结构的实现和应用

堆结构的实现和应用 1. 堆结构的代码实现2. 向上调整算法和向下调整算法时间复杂度3. 堆排序3.1 方法一3.2 方法二3.3 建堆时间复杂度 4. TOP-K问题 1. 堆结构的代码实现 首先&#xff0c;我们先定义一个堆的结构&#xff0c;这里和顺序表的结构一样 typedef int HPDataType;…

Java项目:23 基于SSM实现的在线购物商城系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 这是一个基于ssm框架的购物系统 该项目中有五个子模块。shop-manager模块负责导入该项目所需要的所有依赖包。shop-web模块负责存放前端代码以及项目…

机器人内部传感器阅读笔记及心得-位置传感器-电位器式位置传感器

位置传感器 位置感觉是机器人最基本的感觉要求&#xff0c;可以通过多种传感器来实现。位置传感器包括位置和角度检测传感器。常用的机器人位置传感器有电位器式、光电式、电感式、电容式、霍尔元件式、磁栅式及机械式位置传感器等。机器人各关节和连杆的运动定位精度要求、重…

[力扣 Hot100]Day31 K 个一组翻转链表

题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点…

charles-mock数据

1、通过Charles抓包&#xff0c;找到需要mock的接口&#xff0c;把返回的结果保存到本地。 路径&#xff1a;接口选中-右键保存&#xff08;save Response&#xff09; 2、打开保存的文件&#xff0c;文件返回的结果/结构改成自己想要的模式&#xff0c;改好后保存文件 3、选中…

RM电控讲义【HAL库篇】

这段代码中do while的作用&#xff1a; 宏定义中的语句块&#xff1a;do { ... } while (0) 允许你在宏定义中创建一个语句块&#xff0c;从而可以包含多条语句。这在宏定义中特别有用&#xff0c;因为宏只是简单的文本替换&#xff0c;不像函数那样有作用域和返回类型。因此&…

电阻知识详解

基本介绍 电阻阻碍电流流动&#xff1a;只要有电流流过电阻&#xff0c;就会产生功率损耗 基本单位&#xff1a;欧姆&#xff0c;Ω 换算单位&#xff1a;微欧&#xff08;uΩ&#xff09;、毫欧&#xff08;mΩ&#xff09;、千欧&#xff08;kΩ&#xff09;、兆欧&#x…

YOLO v9 出世!

当今的深度学习方法专注于如何设计最合适的目标函数&#xff0c;以使模型的预测结果能够尽可能地接近真实值。同时&#xff0c;还需要设计一种适当的架构&#xff0c;以便为预测获取足够的信息。现有方法忽略了一个事实&#xff0c;即当输入数据经过逐层特征提取和空间转换时&a…

Linux工具篇Vim

分享Linux的一些基础的工具&#xff0c;今天分享的就是Linux下的vim&#xff0c;vim其实是一个编辑器。我们可以理解为Windows下的一个记事本。 这个是vim的键盘图。 Linux编辑器-vim使用 vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是…

前端基础自学整理|DOM树

DOM&#xff0c;文档对象模型&#xff08;Document Object Model&#xff09;&#xff0c;简单的说&#xff0c;DOM是一种理念&#xff0c;一种思想&#xff0c;一个与系统平台和编程语言无关的接口&#xff0c;一种方法, 使 Web开发人员可以访问HTML元素&#xff01;不是具体方…

K8S故障处理指南:网络问题排查思路

1. 前言 对于私有化环境&#xff0c;客户的网络架构&#xff0c;使用的云平台存在着各种差异&#xff0c;K8S网络可能会出现各种问题&#xff0c;此文着重讲解遇到此种问题的排查方法和思路&#xff0c;不会涉及相关网络底层技术描述. 环境说明 由于我们的k8s网络组件默认使…

gitlab的使用

前一篇文章我们已经知道Git人人都是中心&#xff0c;那他们怎么交互数据呢&#xff1f; • 使用GitHub或者码云等公共代码仓库 • 使用GitLab私有仓库 目录 一、安装配置gitlab 安装 初始化 这里初始化完成以后需要记住一个初始密码 查看状态 二、使用浏览器访问&#xf…