retrofit 2.0 android 教程,初识Retrofit2.0

Retrofit无疑是当下最流行的Android网络请求框架了,是Square提供的开源产品。官方网站是这样介绍Retrofit的—-A type-safe HTTP client for Android and Java,为Android平台的应用提供一个类型安全的HTTP客户端。Retrofit 是一套注解形式的网络请求封装库,它的强大在于让代码结构更加清晰,它可以直接解析JSON数据变成JAVA对象,支持回调操作,处理不同的结果。

2.准备工作

添加依赖:

在AndroidStudio的项目中,在build.gradle文件中添加以下引用:

compile 'com.squareup.retrofit2:retrofit:2.1.0'

数据准备:

使用okhttp请求网络数据的时候,我们需要把服务器返回的JSON数据手动转换成我们的Java对象。而在上文我们提到,Retrofit可以直接解析JSON数据变成JAVA对象,这也是Retrofit灵活与强大的体现。看看怎么实现的

compile 'com.squareup.retrofit2:converter-gson:2.1.0'

首先添加以上引用,这里除了gson以外,还有其他的选择。Retrofit自动转化的核心就是根据服务器返回的json数据定制一个javabean,举个例子:

9953c7ed715d3691f81a1f5674fbbe47.png

服务器返回的很常见的一种数据类型,jsonobject对象里面包括一个jsonarray数组,数组里面包括很多jsonobject对象。我们需要拿到的就是这些jsonobject里的id与name的。看看定制的javabean该怎么写:

public class CityManager {

private List<CityBean> cities;

public List<CityBean> getCities() {

return cities;

}

public void setCities(List<CityBean> cities) {

this.cities = cities;

}

public class CityBean {

private String id;

private String name;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

}

这里有一点需要特别注意的是:保证我们定制的javabean对象的字段要和服务器返回的数据字段一一对应,不然解析会出错

3.基本使用

1.get请求

请求方式为get,请求参数为clientVersion与version,请求数据为城市的id与name,那么使用Retrofit完成数据请求的流程如下:

public class ApiService {

public static final String RES_GET_CITIES_LIST = "Base/getCities";

public interface CityService {

@GET(RES_GET_CITIES_LIST)

Call<CityManager> getCity

(@QueryMap Map<String, String> queryMap);

}

}

retrofit在使用过程中,需要定义一个接口对象,@GET标识为get请求,@GET中所填写的value值和baseUrl组成完整的路径,baseUrl在构造retrofit对象时给出。@QueryMap 标识为接口查询的关键字,这里需要的参数有两个,所以我使用了@QueryMap,与下面这种写法是等价的:

Call getCity

(@Query("clientVersion") String clientVersion, @Query("version") String version);

接口中的方法必须要有返回值,这里将我们定制的javabean对象传进去即可。

public static final String BASE_URL = "http://111.111.1.11/";

Map queryMap = new HashMap<>();

queryMap.put("clientVersion", "205002");

queryMap.put("version", "1622");

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(BASE_URL)

.addConverterFactory(GsonConverterFactory.create())

.build();

ApiService.CityService cityService = retrofit.create(ApiService.CityService.class);

Call call = cityService.getCity(queryMap);

call.enqueue(new Callback()

{

@Override

public void onResponse(Call call, Response response)

{

ArrayList cityNames = new ArrayList<>();

ArrayList cityIds = new ArrayList<>();

for (CityManager.CityBean city : response.body().getCities()) {

cityNames.add(city.getName());

cityIds.add((city.getId()));

}

}

@Override

public void onFailure(Call call, Throwable t)

{

//进行异常情况处理

}

});

Retrofit的构建使用的是构造者模式,指定一个baseUrl,添加一个对象转换器,用于将服务器返回的数据转换成对应实体类对象。构造完成以后,调用create方法就可以拿到我们的接口实例。然后再调用我们之前定义好的获取城市的方法,得到一个call对象,通过call.enqueue即可完成异步的网络请求。最后在数据请求成功的时候,通过response.body()即可拿到我们定义在Call< T >中需要返回的对象,数据请求失败的时候,进行异常的处理。

2.post请求

同样是上面的url,如果改为post请求,要求提交的参数有两个,userId:1001,userName:kaikai,那我们应该怎样实现呢:

public class ApiService {

public static final String RES_GET_CITIES_LIST = "Base/getCities";

public interface CityService {

@POST(RES_GET_CITIES_LIST)

@FormUrlEncoded

Call<CityManager> getCity

(@QueryMap Map<String, String> queryMap,@FieldMap Map<String, String> queryBody);

}

}

@POST标识为post请求,@FormUrlEncoded 与 @FieldMap注解结合表示以表单的方式传递键值对,与下面这两种写法是等价的:

Call getCity

(@QueryMap Map queryMap, @Field("userId") String userId, @Field("userName") String userName);

这种写法很好理解,将FieldMap拆分成了两个Field

Call getCity(@QueryMap Map queryMap, @Body User user);

@Body注解标识的是我们的post参数对象,在使用的时候是:

cityService.getCity(queryMap,new User("1001","kaikai"));

与之对应的User实体类为:

public class User {

private String userId;

private String userName;

public User(String userId, String userName) {

this.userId = userId;

this.userName = userName;

}

}

感觉这种请求方式灵活性不是很高,需要通过传参来构造一个参数对象。没有@FormUrlEncoded 与 @FieldMap这种方式灵活。

Map queryBody = new HashMap<>();

queryMap.put("userId", "1001");

queryMap.put("userName", "kaikai");

Call call = cityService.getCity(queryMap,queryBody);

请求网络数据的时候,以上是需要变化的地方,其他的地方保持不变。

4.常用配置

1.设置打印拦截器

compile 'com.squareup.okhttp3:logging-interceptor:3.4.0-RC1'

首先添加依赖,进行log的打印

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();

logging.setLevel(HttpLoggingInterceptor.Level.BODY);

HttpLoggingInterceptor 是一个拦截器,用于输出网络请求和结果的 Log,可以配置 level 为 BASIC / HEADERS / BODY,查看源码它们级别依次是:

Logs request and response lines

Logs request and response lines and their respective headers

Logs request and response lines and their respective headers and bodies (if present)

这里我们选择BODY即可,会打印出网络请求的url,头部信息headers,返回数据bodies所有信息

2.设置连接与读取超时

OkHttpClient okHttpClient = new OkHttpClient.Builder()

.connectTimeout(30, TimeUnit.SECONDS)

.readTimeout(30, TimeUnit.SECONDS)

.addInterceptor(logging)

.build();

设置连接超时以及读取超时,然后将我们设置的拦截器添加进来。最后记得调用Retrofit.Builder()的.client(okHttpClient)方法,将我们已经设置好的okHttpClient关联好。

5.简单封装

/**

* Created by tangyangkai on 16/6/29.

*/

public class ApiWrapper {

public static final String BASE_URL = "http://111.111.1.11/";

private Retrofit retrofit;

private static ApiWrapper instance;

private String token;

private ApiWrapper() {

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();

logging.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient okHttpClient = new OkHttpClient.Builder()

.connectTimeout(30, TimeUnit.SECONDS)

.readTimeout(30, TimeUnit.SECONDS)

.addInterceptor(logging)

.build();

retrofit = new Retrofit.Builder()

.baseUrl(BASE_URL)

.addConverterFactory(GsonConverterFactory.create())

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

.client(okHttpClient)

.build();

}

public static ApiWrapper getInstance() {

if (instance == null) {

synchronized (ApiWrapper.class) {

if (instance == null) {

instance = new ApiWrapper();

}

}

}

return instance;

}

public <T> T create(Class<T> services) {

return retrofit.create(services);

}

}

单例模式构建的一个ApiWrapper,这样就不用每次请求网络数据的时候去构建一个retrofit,使用的时候也很方便:

ApiService.CityService cityService = ApiWrapper.getInstance().create(ApiService.CityService.class);

Call call = cityService.getCity(queryMap);

其他的代码与前面的保持一致即可。

Retrofit的灵活与强大远不止这些,比如访问动态url,设置网络缓存,管理cookie,自定义转换器等,以后项目中有用到的地方再更新博客。我也是最近才从okHttp转战Retrofit的,博客有不当的地方欢迎指正。

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

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

相关文章

小学生学计算机编程的必要,小学生学编程,真的那么重要吗

原标题&#xff1a;小学生学编程&#xff0c;真的那么重要吗编程简单的说就是告诉计算机要做什么。人类需要将解决问题的思路、方法和手段通过计算机能够理解的形式告诉计算机&#xff0c;使得计算机能够根据人的指令一步一步去工作&#xff0c;完成某种特定的任务。计算机是迄…

家用计算机机箱怎么选,DIY装机怎么选择电脑机箱 新手必读的电脑主机箱选购指南...

在这个讲究颜值的时代&#xff0c;对于一些主要外观的外观党来说&#xff0c;内外皆修的机箱也是算重要的。DIY装机怎么选择电脑机箱&#xff1f;下面装机之家小编就来谈下新手必读的电脑主机箱选购指南&#xff0c;对于装机选择机箱困难症的朋友不妨来看看。一、首先要明白自己…

计算机启动应用程序的方法,excel的程序_Excel2010中启动应用程序的三种方法

使用Excel时&#xff0c;需要先启动应用程序&#xff0c;怎么去进行操作启动它?今天&#xff0c;学习啦小编就教大家在Excel2010中启动应用程序的三种方法。Excel2010中启动应用程序的三种步骤如下&#xff1a;1.开始菜单在桌面上&#xff0c;单击“开始”&#xff0c;“所有程…

西安工业学院计算机系王翊,西安文理学院艺术学院

“爱的长歌”声乐教学与实践汇报音乐会——王翊师生音乐会圆满结束6月26日我院第八场“爱的长歌”声乐教学与实践汇报音乐会—王翊师生音乐会圆满结束。音乐会受到老师和同学的一致赞誉。整场音乐会高潮迭起&#xff0c;掌声不断。音乐会的学生由16级音乐表演专业的声乐方向的同…

计算机如何制作U盘启动盘,电脑如何制作U盘启动盘

为什么要制作U盘启动盘&#xff1f;U盘启动盘是什么&#xff1f;今天小编和大家普及一下&#xff0c;什么是U盘启动盘。就是一个简简单单的U盘&#xff0c;经过装机工具软件就变成了一个装有PE镜像文件的U盘&#xff0c;通过这个启动盘可以进入PE系统对电脑进行重装系统。话不多…

c 服务器二次验证码,V5验证官网 - 基础套餐免费 -滑块验证,行为验证,防刷验证 - 文档...

平台对接V5验证前后端对接流程如下图所示&#xff1a;前后端调用时序图对接V5验证分为业务网站后台api对接以及业务前端代码引入两部分。业务网站后台获取验证Token及验证服务器(getToken)用于网站后台定时通过V5控制台刷新获取验证所需要的Token及验证服务器地址。Token有效期…

战队服务器人员位置,和平精英:职业战队如何分配成员位置?5大定位划出5种职位...

#百度APP&百家号杯和平精英#随着时间的推进&#xff0c;距离百家号杯的决赛越来越近了&#xff1b;一百只精英队伍你争我抢都想要争取冠军的宝座。在最新的一场循环赛当中SC战队以70分的总积分占领榜首&#xff0c;Dae战队以69分的总积分紧随其后排名第二。虽说SC拿到了循环…

sony电视播放服务器文件,sony电视怎么样 sony电视支持视频格式【图文详解】

现在&#xff0c; 电视机 对于每个家庭来说已然不是什么奢侈品&#xff0c;并且已经成为必备的家庭电器之一。其实&#xff0c;国产电视机中也有不少的知名品牌&#xff0c;但是许多消费者对国外的电子技术持有更高的认可度&#xff0c;因此下面小编就来跟大家讲讲sony电视&…

css三栏布局技巧,CSS-三栏布局的常用6种方法

三栏布局一般指左右两栏固定宽度&#xff0c;中间一栏自适应的布局方法&#xff0c;也是许多网站常用的布局方式。如下图&#xff1a;该示例在一个html文件中编写&#xff0c;为方便起见&#xff0c;预先写好一个通用的css&#xff0c;左右宽度都为100px&#xff1b;1.浮动三栏…

jdk、jre及jvm的关系

很多程序员已经干了一段时间java了依然不明白jdk与jre的区别。 JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK&#xff0c;它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包&#xff0c;可以包括函数库、编译程序等。 …

我的理解之JAVA中的4种访问权限

一、Java中有四种访问权限&#xff0c;private、default&#xff08;一般省略&#xff09;、public、protected。 private: Java语言中对访问权限限制的最窄的修饰符&#xff0c;一般称之为“私有的”。被其修饰的属性以及方法只能被该类的对象访问&#xff0c;其子类不能访问&…

ssh连接阿里云服务器遇到的坑

1. 出现‘Host key verification failed.’ 解决方案在这里找到&#xff1a; https://askubuntu.com/questions/45679/ssh-connection-problem-with-host-key-verification-failed-error 2. 自动断开—每隔一两分钟就自动断开 参考&#xff1a; https://superuser.com/quest…

云服务器文件传输问题

最近再做一个web项目&#xff0c;目前决定先把应用放在云服务器上。我选择的云主机是aliyun的Ubuntu 16.04主机。部署好云主机环境后&#xff0c;就需要把我在本地开发好的程序上传到云主机了。刚开始打算用ftp协议来传输&#xff0c;于是参照网上的教程&#xff08;Ubuntu 16.…

Naive Bayes Classifier - 朴素贝叶斯分类器

Naive Bayes Classifier - 朴素贝叶斯分类器 简介 在机器学习中&#xff0c;朴素贝叶斯分类器是一系列基于“贝叶斯原理”和“特征之间独立分布假设”的概率分类器的总称。把它的名称分成两部分来看&#xff0c;一部分是“贝叶斯”对应的是“贝叶斯原理”&#xff1b;另一部分…

PL/SQL Developer调试Oracle存储过程

1&#xff0c;选中存储过程&#xff0c;右键&#xff0c;点击Edit&#xff0c;会打开一个窗口&#xff0c;提示错误信息2&#xff0c;添加debug information3&#xff0c;开始调试4&#xff0c;点击调试窗口上面的按钮进行调试

TCP三次握手和四次挥手以及11种状态

TCP三次握手和四次挥手以及11种状态 1、三次握手 置位概念&#xff1a;根据TCP的包头字段&#xff0c;存在3个重要的标识ACK、SYN、FIN ACK&#xff1a;表示验证字段 SYN&#xff1a;位数置1&#xff0c;表示建立TCP连接 FIN&#xff1a;位数置1&#xff0c;表示断开TCP连…

计算机网络体系结构——各层的功能

OSI七层架构 物理层主要功能&#xff1a;实现比特流的透明传输。基本单位&#xff1a;比特。 数据链路层主要功能 &#xff1a;封装成帧 。把帧从原MAC传到目的MAC&#xff08;相邻节点之间帧的透明传输&#xff09; 差错检测 循环冗余检测法。只检测有没有比特错误&#xf…

HTTP报文分析

一、HTTP请求报文解剖 HTTP请求报文由3部分组成&#xff08;请求行请求头请求体&#xff09;&#xff1a; 下面我们基于socket编写一个简单的HTTP server import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.Inp…

SSM框架整合一(springmvc+spring+mybatis+maven+tomcat)

一&#xff0c;环境说明 jdk1.7.0_07(cmd命令行输入java -version查看)&#xff0c;点击下载 eclipse Kepler Service Release 2 apache-maven-3.3.9(cmd命令行输入mvn -v查看)&#xff0c;点击下载 apache-tomcat-7.0.52&#xff0c;点击下载 mysql-5.5.28-winx64&#xff0c…

如何在windows机器上安装apache ab

为什么要使用apache ab&#xff0c;apache ab的是用来干嘛的&#xff0c;apache ab的命令&#xff1f; 如果您是来找上面这些问题的答案&#xff0c;那么请立刻关掉当前页面&#xff0c;因为这篇文章是纯粹的安装教程&#xff0c;避免浪费时间。 一&#xff0c;安装环境 win…