网络请求的痛点(可略过不看)
- 同一款应用程序发起的网络请求绝大多数指向是同一个服务器域名。
- 服务器提供的接口通常可以根据功能来分类。
- 开发者希望“调用一个接口获取它的返回值”这样的方式,而不是直接调用服务器接口。
(说白了就是不想关心通讯细节)
Retrofit的好处
项目主页地址:https://github.com/square/retrofit
- 可以配置一个根路径,然后在指定服务器接口地址的时候只需要使用相对路径即可,这样就不用每次都指定完整的URL地址了。
- Retrofit允许我们对服务器进行归类,将功能同属一类的服务器接口定义到同一个接口文件中,让代码结构更加合理。
- 只需要在接口文件中声明一系列方法和返回值,然后通过注解的方式指定该方法对应哪个服务器接口,以及需要提供哪些参数。
程序调用方法,Retrofit会自动向对应的服务器接口发起请求,并将相应的数据解析成返回值声明的类型。
实际使用简单示例
①首先添加依赖
在app/build.gradle文件中添加
由于Retrofit是基于OkHttp开发的,因此添加第一条依赖会自动将Retrofit、OkHttp、Okio库一起下载。
此外,Retrofit会将服务器返回的JSON数据自动解析成对象,所以会自动将GSON库一起下载。
由于Retrofit会借助GSON将JSON数据转换成对象,那么这里新增一个App类,并加入id、name、version三个字段
接下来根据服务器接口的功能进行归类
通常Retrofit的接口文件建议以具体功能种类名开头,并以Service结尾(一种命名习惯)
注意@GET注解的使用,表示当调用getAppData()方法时候Retrofit会发起一条GET请求,地址就是后边传入的具体参数(这里的get_data.json是一个相对路径,根路径我们稍后设置)
getAppData()方法的返回值必须声明成Retrofit中内置的Call类型,并通过泛型指定服务器响应的数据应该转换成什么对象。这里由于响应的是一个包含App数据的JSON数组,因此我们将泛型声明成
(这是是假设的需求,并不是其他的也要数组类型)
Retrofit还可以结合RxJava使用可以将返回值声明成Observable、Flowable等类型,知道有这么码事先,这里不做讨论。
下面是使用步骤:
- 利用Retrofit.Builder创建Retrofit实例,注意这里要用.baseUrl(“www.baidu.com”)指定根路径,还有.addConverterFactory(GsonConverterFactory.create())指定解析方式,最后调用.bulid()完成实例创建。
- 利用Retrofit 实例的creat()方法传入相应的class.java接口文件创建接口的动态代理对象。(拿到这个动态代理对象就是为了使用接口中的方法)
- 动态代理对象调用接口中的getAppData()方法,返回一个
类型的数据,再调用enqueue()方法,Retrofit会根据注解进行网络请求并将服务器回应数据回调到enqueue()方法中传入的Callback实现里面。
(Retrofit发起请求的时候会自动在内部开启子线程,当数据回调到CallBack之后,Retrofit又会切回主线程)- 最后在Callback的onResponse()方法中调用response.body()方法达到Retrofit解析后的对象,也就是
对象,这样就完成了请求解析。
(注意在Callback中要实现onResponse与onFailure)
这里拿到数据只进行了简单遍历打印
如果传入的是HTTP,记得要进行网络安全配置,从Android 9.0开始,应用程序默认只支持HTTPS传输
方法在我的其他文章



