首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入浅出Retrofit2.x(一)

:代理类在程序运行时创建代理方式被成为动态代理,代理类并不是在Java代码定义,而是在运行时在 Java 代码动态生成,当我们使用代理对象执行代理对象方法时,都会被替换成执行invoke方法...,在 invoke 方法可以拿到代理对象,代理对象方法及参数,当然这里也涉及到一些反射相关知识,这里就不详细展开了;结合上面的代码,service 就是代理对象,当 service 调用 getUserString...() 方法时,就会触发 invoke 方法,进而通过反射可以拿到代理对象,方法及参数,具体细节就不详细讲了,感兴趣同学可以读 Retrofit 源码进行理解;上面代码拿到call 后就是网络请求了...另外我们还可以使用Retrofit同步请求接口(注意要放在子线程请求): Response response = call.execute(); 2.2 优化接口定义 在上面的请求...首先在 Gradle 添加依赖: implementation 'com.squareup.retrofit2:converter-gson:2.3.0' 接下来我们在创建Retrofit 对象时候设置它转换器

74310

Android 原生 SQLite 数据库一次封装实践

行时注解处理相对更简单一些(接口和参数较容易适配、处理流程也可以直接写我们熟悉安卓原生代码),而且前面已经有了大名鼎鼎网络请求库Retrofit使用运行时注解实现网络请求典型范例,因此可以依葫芦画瓢尝试实现一下数据库增删改查操作...相信大部分安卓客户端开发同学都用过Retrofit(网络请求常用库),其大概原理是:使用动态代理获取接口对应Method对象为入口,并通过该Method对象各种参数(注解修饰)构造出Request对象抛给...八、扩展知识——泛型类型擦除 关于类型擦除,感觉很多人都有一些误区,特别是客户端开发平时涉及较少,感觉都不太理解: 根据我们常识都知道Java泛型在运行时是类型擦除,编译后就不会有具体类型信息了...那么问题来了,既然类型都擦除了,那retrofit又是怎样能在运行时拿到方法泛型参数类型(包括参数类型和返回类型)呢?比如内部可以根据函数返回类型将json转为对应bean对象。...泛型类型信息,具体保存在Signature区域,可以使用Type子类接口在运行时获取到泛型类型信息。

90910
您找到你想要的搜索结果了吗?
是的
没有找到

Retrofit原理_Retrofit

对象, 构建一个网络请求载体对象,和okhttp构建OkhttpClient对象有一样意义,只不过 retrofit在build时候有非常多初始化内容,这些内容可以为后面网络请求提供准备,如准备...create方法通过动态代理模式,生成了实现了具体网络请求接口对象,并在InvocationHandler invoke方法中统一处理网络请求接口实体对象方法;2)invoke方法会通过方法构造一个...4.1 动态代理 动态代理原理主要是在运行时动态生成代理类,然后根据代理类生成一个代理对象,在这个代理对象方法又 会调用InvocationHandlerinvoke来转发对方法处理。...ServiceMethod对象,如果没有,则通过Method和Retrofit对象构造一个 ServiceMethod对象,并将其放入缓存。...更多关于CallAdapter在retrofit实现细节,大家可以看我其他文章。

61730

Retrofit解析6之面向接口编程

我是少了三个方法,分别是 boolean isExecuted(); 判断是否正在运 sCanceled(); 判断是否已经取消了 Call clone(); 复制一个连接,为了轮训和请求失败时候用...其次,大家知道RetrofitCall泛型T是responseBody,这个类型是泛型,所以最后反序列化时候需要反序列化成一个对象,这个需要指定这个对象类型,所以还应该获取这个类具体"...实例由对应Factory来创建,这个对应Factory是通过Retrofit.BuilderaddCallAdapterFactory(Factory)方法添加到Retrofit对象,在上述过程实现初始化...null; } } } 1、看下类注释 在HTTP请求实现对象转化。...retrofit) 注释:返回一个可以处理将HTTP请求(resquest)bodyConverter对象,转出类型是RequestBody。

1K30

Retrofit与动态代理

如果还使用静态代理的话,则这个代理类中都是相同代码,并且后续再添加接口,仍然需要修改该代理类 于是,Java提出了动态代理概念。 动态代理 动态代理,也就是在运行时创建代理类。...在运行过程,会在虚拟机内部创建一个Proxy类。通过实现InvocationHandler接口,来代理委托类函数调用。...Retrofit动态代理 在Retrofit,使用动态代理来对接口中注释进行解析,解析后完成OkHttp参数构建。...转换工厂,创建Retrofit对象 String url = "https://api.github.com/"; Retrofit retrofit = new Retrofit.Builder()...会通过调用loadServiceMethod函数,对Method注释进行解析,并且返回ServiceMethod对象,传入OkHttpCall,构建OkHttp请求。

89410

源码解析: Retrofit2.5

创建实体类   访问 小木箱 github 仓库,通过get请求得到了以下报文: 然后,通过 Gsonformat 得到相关实体对象: class MicroKibacoRepo {...通过findPlatform获取对应平台,同时也初始化了defaultCallAdapterFactory工厂 ServiceMethod 接口映射网络请求对象,通过动态代理,将自定义接口标注转换为该对象...在被初始化时候,是有一个初始化过程,会去读注解,中间是有耗时,分布式加载网络请求, validateEagerly 是方便调试 private void eagerlyValidateMethods...面试题分享 Retrofit请求参数说明 Retrofit设计模式 1....建造者模式 Retrofit对象创建、ServiceMethod对象创建都使用Build模式,将复杂对象创建和表示分离,调用者不需要知道复杂创建过程,使用Build相关方法进行配置创建对象

75000

Retrofit2.0通俗易懂学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava

/") .build(); 这里大家就看到我们baseUrl了,就是我们Gank接口前缀,我们现在有了retrofit,通过他create方法就可以创建我们接口对象了...恩,可以看到,已经成功请求到了结果了,这就是Retrofit无参简单请求了,但是这里我们其实还可以做点文章,Retrofit + OkHttp + Gson更配哦,那我们添加GsonJar之后我们写一个实体类...所以还是很方便 六.正常请求 我们做一个和官网一样例子,实体类GankBean已经有了,那我们重新修改一下接口,让他返回这个实体类 import retrofit2.Call; import retrofit2...,但是这里最后拼接时一个key,所以在传参前面加上Query,如果你想两个参数,还有一个城市的话,你就多加一个参数咯,我们现在初始化一下 Retrofit retrofit = new Retrofit.Builder...(GsonConverterFactory.create()) .build(); api = retrofit.create(GankApi.class); 这样拿到我们接口对象后直接请求

1.6K60

MVVM数据持久化(一)——ROOM集成

用@Database注解类应满足以下条件: 是一个继承RoomDatabase抽象类。 在注释包含与数据库相关联实体列表。 包含一个具有0个参数抽象方法,并返回用@Dao注释类。...在运行时,您可以通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()获取数据库实例。 Entity: 表示数据库内表。...要为一个entity添加索引,在@Entity注解添加indices属性,列出你想放在索引或者组合索引字段。 有时候,某个字段或者几个字段必须是唯一。...这种情况下,你可以使用@Embedded注解,表示你想把一个对象分解为表字段。然后你就可以像其它独立字段那样查询这些嵌入字段。...api接口。

1.5K20

Android使用Retrofit进行网络请求及和Kotlin结合使用

前言 Retrofit是现在比较流行网络请求框架,可以理解为okhttp加强版,底层封装了Okhttp。 准确来说,Retrofit是一个RESTfulhttp网络请求框架封装。...@FiledMap 多用于Post请求表单字段,需要结合@FromUrlEncoded使用 @Part 用于表单字段,Part和PartMap与@multipart注解结合使用,适合文件上传情况...@PartMap 用于表单字段,默认接受类型是Map,可用于实现多文件上传 @Path 用于Url占位符 @Query 用于Get请求参数 @QueryMap...),每个键值对需要用@Part来注解键名,随后对象需要提供值 @Streaming 表示响应用字节流形式返回,如果没有使用注解,默认会把数据全部载入到内存,该注解在下载大文件时特别有用 参数示例...import retrofit2.Response import retrofit2.http.GET interface UserApi { //get请求 @GET("userlist.json

50410

Android高频面试专题 - 架构篇(三)Retrofit

2、简单介绍下retrofit实现原理 首先,通过Builder创建Retrofit对象,在create方法,通过JDK动态代理方式,生成实现类,在调用接口方法时,会触发InvocationHandler...,通过toCall方法将其转换成okhttpcall对象,有了Call对象,就可以发送请求了。...对象时传入baseUrl转换成对象,进行格式校验等。...converterFactories 数据解析器Converter,将response通过converterFactory转换成对应JavaBean数据形式,常见解析器有,GsonConverterFactory...注解使用 使用反射在运行时获取注解,进行业务逻辑处理 通过预编译工具进行处理(pre-compiler tools),在编译期间生成新类文件 5、retrofit多个BaseUrl如何解决 根据不同

1.6K20

Android网络编程(九)Retrofit2前篇

前言 Retrofit是Square公司开发一款针对Android网络请求框架,Retrofit2底层基于OkHttp实现,而OkHttp现在已经得到Google官方认可,不了解OKHttp请查看本系列前作...2.用Retrofit异步访问网络 编写实体类 我们可以用JSON字符串转换成Java实体类(POJO)这个网站将Json转为实体类,经过修改实体类如下: IpModel.Java: ?...用Retrofit创建接口文件 ? 用retrofit创建我们之前定义IpService接口对象,并调用该接口定义getIpMsg方法得到Call对象。 用Call请求网络并处理回调 ?...这里是异步请求网络,回调Callback是运行在主线程。得到返回Response后将返回数据country字段用Toast显示出来。...完整代码如下: ? 3.请求参数 上文讲了Retrofit访问网络基本方法,接下来我们来了解下Retrofit常用请求参数。

1.1K60

这一次爱奇艺大佬带你深度分析OkHttp源码与Retrofit封装,彻底了解!

Step3:构建请求Call,也就是将具体网络请求与执行请求实体进行绑定,形成一个具体正式可执行实体。 Step4:后面就进行网络请求了,然后处理网络请求数据了。...对象,构建一个网络请求载体对象,和OkHttp构建OkhttpClient对象有一样意义,只不过retrofit在build时候有非常多初始化内容,这些内容可以为后面网络请求提供准备,如准备 现成转换...Step3:构建具体网络请求对象Request(service),在这个阶段要完成任务: 1)将接口中注解翻译成对应参数; 2)确定网络请求接口返回值response类型以及对应转换器;...构建蓝色Requet方案,retrofit是通过注解来进行适配 3. 配置Call过程,retrofit是利用Adapter适配OkhttpCall 4....相关面试题 来看看大厂面试关于OkHttp与Retrofit面试官们都喜欢问些什么问题呢?

75000

Retrofit解析9之流程解析

在build()方法里面的流程如下: 1、获取对应CallAdatper 2、获取对应Converter 3、方法注解解析,给相应ServiceMethod.Builder字段赋值,从注解转化为对象...4、内部检查,保证逻辑正确 5、方法参数注解解析,给相应ServiceMethod.Builder字段赋值,从注解转化为对象。 6、排除错误逻辑。...(此时ServiceMethod.Builder字段已经赋值完毕) 7、构造ServiceMethod对象并返回 整个上面流程如下图: ?...5、调用build来来获取一个okhttp3.Request对象(build()方法内部是直接new一个Request) 注意事项: retrofit2.RequestBuilder类中有一个字段...对象,然我们来看下retrofit2.Response构造函数 private Response(okhttp3.Response rawResponse, T body, ResponseBody

2.1K41

Android MVP+RxJava+Retrofit (2) RxJava+Retrofit

@POST 注解发送了POST请求,Retrofit还提供了很多其他注解类型 第一类 网络请求方法 @GET、@POST、@PUT、@DELETE、@HEAD分别对应 HTTP网络请求方式...& @PartMap 发送 Post请求 时提交请求表单字段,与@Field区别:功能相同,但携带参数类型更加丰富,包括数据流,所以适用于 有文件上传 场景,与 @Multipart 注解配合使用...实例 上传文件+字段时候 必须变为RequestBody 参数 方可才能上传 Retrofit retrofit2 = new Retrofit.Builder() ....大体使用情况,接下来就简单介绍RxJava使用,Retrofit 与RxJava 一百度就很多原理之类大体说都差不多,大同小异.我主要以实战为主,如何使用 稍带点基础… 初始化Retrofit时候必要配置...字符串转化为对象 替换成RxJava请求代码如下 Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constant.IP

71430

入木三分:从设计者角度看Retrofit原理

java动态代理就是在运行时通过反射为目标对象做一些附加操作,代码如下: class DaoProxy() { //创建代理类 fun createProxy(): Any {...动态代理与静态代理核心思想一致,区别是动态代理可以在运行时通过反射动态创建一个切面(InvocationHandler#invoke),用来消除模板代码。...类型对象,最后来看一下它invoke()方法。...可见这里门面模式和代理模式是相辅相成 Retrofit事先都不知道ApiService方法数量,就算知道也避免不了逐一解析而产生大量模版代码,此时可通过引入动态代理在运行时动态解析 从而解决这一问题...callAdapterFactories是3.1结尾build()初始化,通过platform添加默认类型,也可以通过addCallAdapterFactory()添加RxJava之类适配器类型。

1.3K20

2018 年你不能错过 Java 类库

response = client.newCall(request).execute(); return response.body().string(); } GitHub, Website Retrofit...@EqualsAndHashCode - 实现相等判断变得容易了:它会从你对象字段里为你生成hashCode和equals方法实现。...final或非空字段作为一个参数,或者每一个字段都作为参数。...参数化运行器区别如下: 更明确 - 参数实在测试方法参数,而不是在类字段 更少代码 - 你不需要用构造函数来设置参数 你可以在同一个类混合使用参数化和非参数化方法。...标有@Inject注解字段会被自动注入,不需要担心会遗忘掉它们 使得将对象连接在一起变得容易,因此你可以将一个单元测试变成集成测试一部分 @RunWith(JukitoRunner.class) public

83720

2017 年你不能错过 Java 类库

response = client.newCall(request).execute(); return response.body().string(); } GitHub, Website Retrofit...@EqualsAndHashCode - 实现相等判断变得容易了:它会从你对象字段里为你生成hashCode和equals方法实现。...final或非空字段作为一个参数,或者每一个字段都作为参数。...参数化运行器区别如下: 更明确 – 参数实在测试方法参数,而不是在类字段 更少代码 – 你不需要用构造函数来设置参数 你可以在同一个类混合使用参数化和非参数化方法。...标有@Inject注解字段会被自动注入,不需要担心会遗忘掉它们 使得将对象连接在一起变得容易,因此你可以将一个单元测试变成集成测试一部分 @RunWith(JukitoRunner.class)public

1K80

【译】Retrofit 2 - 如何从服务器下载文件

这对于一些特殊文件下载是非常有用,也就是说这个请求可能要依赖一些参数,比如用户信息或者时间戳等。你可以在运行时构造URL地址,并精确请求文件。...如果你还没有试过动态URL方式,可以翻到开头,看看这篇专题博客Retrofit 2动态URL。 哪一种方案对你有用呢,我们接着往下看。...一旦创建了service,我们就能像其他Retrofit调用一样做网络请求了。 还剩下一件很重要事,隐藏在代码块writeResponseBodyToDisk()函数:负责将文件写进磁盘。...如何保存文件 writeResponseBodyToDisk()方法持有ResponseBody对象,通过读取它字节,并写入磁盘。...而且这里存在一个大问题:默认情况下,Retrofit在处理结果前会将整个Server Response读进内存,这在JSON或者XML等Response上表现还算良好,但如果是一个非常大文件,就可能造成

2.2K10
领券