[置顶] 浅谈我为什么选择用Retrofit作为我的网络请求框架
时间:2022-04-26
本文章向大家介绍[置顶]
浅谈我为什么选择用Retrofit作为我的网络请求框架,主要内容包括比较AsyncTask、Volley、Retrofit三者的请求时间、使用、请求范例、进阶使用1:ConverterFactory转换工厂、进阶使用2: 常用接口范例声明、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
比较AsyncTask、Volley、Retrofit三者的请求时间
使用 |
单次请求 |
7个请求 |
25个请求 |
---|---|---|---|
AsyncTask |
941ms |
4539ms |
13957ms |
Volley |
560ms |
2202ms |
4275ms |
Retrofit2.0 |
312ms |
889ms |
1059ms |
Retrofit2.0 完胜
使用
添加依赖
build.gradle
compile ‘com.squareup.retrofit2:retrofit:2.0.0-beta4’
请求范例
以淘宝的ip库请求为例
- 地址:http://ip.taobao.com/service/getIpInfo.php
- 请求参数:ip
- 请求方法: get
声明接口
public interface ApiControl {
//@Query注解的作用理解为查询条件,这里表示需要查询的字段为ip
//ResponseBody是Retrofit自带的返回类,
@GET("http://ip.taobao.com/service/getIpInfo.php")
Call<ResponseBody> getIpInfo(@Query("ip") String ip);
}
调用接口
//创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
//当我们的@GET()里有url时,这个baseUrl无效。但是这个必须要填,不然会报错,神奇。
.baseUrl("http://www.taobao.com.cn/")
.build();
ApiControl apiStores = retrofit.create(ApiControl.class);
Call<ResponseBody> call = apiStores.getIpInfo("220.160.193.209");
//在主线程里,异步调用。
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response) {
try {
Log.i("onResponse", "response=" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t) {
Log.i("onFailure", "onFailure=" + t.getMessage());
}
});
同步调用
try {
Response<ResponseBody> response = call.execute();
} catch (IOException e) {
e.printStackTrace();
}
进阶使用1:ConverterFactory转换工厂
可以帮我们将获取到的数据转换为JAVA BEAN
Retrofit支持以下转换
Gson: com.squareup.retrofit2:converter-gson Jackson: com.squareup.retrofit2:converter-jackson Moshi: com.squareup.retrofit2:converter-moshi Protobuf: com.squareup.retrofit2:converter-protobuf Wire: com.squareup.retrofit2:converter-wire Simple XML: com.squareup.retrofit2:converter-simplexml Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
Retrofit这里以GsonConverterFactory的为例
添加依赖
compile ‘com.squareup.retrofit2:converter-gson:2.0.0-beta4’
定义java bean
public class IpInfo {
private int code;
private DataBean data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
private String country;
private String country_id;
private String area;
private String area_id;
private String region;
private String region_id;
private String city;
private String city_id;
private String county;
private String county_id;
private String isp;
private String isp_id;
private String ip;
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCountry_id() {
return country_id;
}
public void setCountry_id(String country_id) {
this.country_id = country_id;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getArea_id() {
return area_id;
}
public void setArea_id(String area_id) {
this.area_id = area_id;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public String getRegion_id() {
return region_id;
}
public void setRegion_id(String region_id) {
this.region_id = region_id;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCity_id() {
return city_id;
}
public void setCity_id(String city_id) {
this.city_id = city_id;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
public String getCounty_id() {
return county_id;
}
public void setCounty_id(String county_id) {
this.county_id = county_id;
}
public String getIsp() {
return isp;
}
public void setIsp(String isp) {
this.isp = isp;
}
public String getIsp_id() {
return isp_id;
}
public void setIsp_id(String isp_id) {
this.isp_id = isp_id;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
}
接口方法声明
//GSON转换数据
@GET("http://ip.taobao.com/service/getIpInfo.php")
Call<IpInfo> getIpInfo2(@Query("ip") String ip);
调用接口
Call<IpInfo> ipInfoCall = apiStores.getIpInfo2("220.160.193.207");
ipInfoCall.enqueue(new Callback<IpInfo>() {
@Override
public void onResponse(Response<IpInfo> response) {
Log.d("onResponse",response.body().getData().getCity());
}
@Override
public void onFailure(Throwable t) {
Log.i("onFailure", "onFailure=" + t.getMessage()); }
});
进阶使用2: 常用接口范例声明
//这里url为请求地址
//多参数,用map,注解用@QueryMap
@GET("url")
Call<ResponseBody> getInfo(@QueryMap Map<String,String> params);
//post的请求参数是放在请求体中的,就是body内(详见http请求),这是以json格式传递参数的
@POST("url")
@FormUrlEncoded
Call<ResponseBody> doLogin(@Body User user);
//post表单传递,map,就是我们一般用到的
@POST("url")
@FormUrlEncoded
Call<ResponseBody> doLogin(@FieldMap Map<String,String> params);
//也是post表单传递,是以单个进行传递
@FormUrlEncoded
@POST("url")
Call<ResponseBody> doLogin(@Field("username") String name, @Field("password") String password);
//请求头更改
@FormUrlEncoded
@Headers({"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"})
Call<ResponseBody> getUserInfo();
//动态改变请求头
@GET("/user")
Call<User> getUser(@Header("Authorization")
String authorization);
- jquery mobile 移动web(4)
- [C#6] 3-null 条件运算符
- ServiceStack.Redis 使用教程
- WordPress 标签页面只有一篇文章时自动跳转到该文章
- OS X 上使用.NET开发应用程序
- [C#6] 2-nameof 运算符
- Key-Value Coding(KVC),Key-Value Observing(KVO)和Cocoa Bindings for MonoMac
- [C#6] 7-索引初始化器
- jquery mobile 移动web(3)
- 卷积神经网络详解(二)——自己手写一个卷积神经网络
- VS 2010 SP1的一个功能(添加可部署依赖项)
- 一组扁平化组件推荐下载(PSD 格式)
- [C#6] 6-表达式形式的成员函数
- 在启用了IPV6的机器上获取客户端ipv4地址
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法