【Android】Retrofit 2.0 的使用
一、概述
Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库。来自官网的介绍:
A type-safe HTTP client for Android and Java
- Rest API是一种软件设计风格,服务器作为资源存放地。客户端去请求GET,PUT, POST,DELETE资源。并且是无状态的,没有session的参与。关于REST的介绍可以参考维基百科
- retrofit模型如下:(来自如何使用Retrofit写一个Android的REST客户端的小教程)
- retrofit模型
1) POJO或模型实体类 : 从服务器获取的JSON数据将被填充到这种类的实例中。
2) 接口 : 我们需要创建一个接口来管理像GET,POST...等请求的URL,这是一个服务类。
3) RestAdapter类 : 这是一个REST客户端(RestClient)类,retrofit中默认用的是Gson来解析JSON数据,你也可以设置自己的JSON解析器。二、原理
在发起请求时,整个框架主要通过Call来封装每一次的请求。
调用同步方法时,会使用应用线程来发送请求;
调用异步方法时会通过 OkHttp 的 Dispatcher 提供的线程来执行请求。Dispatcher:Dispatcher内部实现了懒加载无边界限制的线程池方式,同时该线程池采用了SynchronousQueue这种阻塞队列。SynchronousQueue每个插入操作必须等待另一个线程的移除操作,同样任何一个移除操作都等待另一个线程的插入操作。显然这是一种快速传递元素的方式,也就是说在这种情况下元素总是以最快的方式从插入者(生产者)传递给移除者(消费者),这在多任务队列中是最快处理任务的方式。
二、使用
- 添加依赖(gradle)或导jar包
添加依赖
在modul的build文件下的dependencies中添加
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
- 点击Sync Now
(或)导jar包,点击下载
retrofit-2.0.0-beta2.jar| Retrofit库
converter-gson-2.0.0-beta2_.jar | Gson解析库
gson-2.4.jar | Gson解析库
okhttp-2.5.0.jar | Okhttp请求库
okio-1.6.0.jar | Okhttp请求库
说明:
Retrofit依赖于okhttp,所以需要集成okhttp
API返回的数据为JSON格式,在此我使用的是Gson对返回数据解析 - 添加权限
由于是网络请求,需要在manifest中添加网络请求的权限
- 添加依赖(gradle)或导jar包
<uses-permission android:name="android.permission.INTERNET"/>
- 创建实体类
这是使用Gson解析,需要创建一个POJO(Java对象)。服务器返回的JSON数据不能在Java里直接使用,所以我们需要用模型类来做转换。这里使用jsonschema2pojo(需翻墙)来创建POJO。
得到JSON数据如下:JSON数据复制JSON字符串到输入框中,填写报名、类名,源代码类型选择JSON,注解类型选择Gson,点击Preview即可得到对应的POJO,如下图
复制到jsonschema2pojo中点击preview,得到对应的实体类。将其拷贝到自己的工程中即可。
得到的实体类import com.google.gson.annotations.SerializedName;
@Generated("org.jsonschema2pojo")
可删除 - 创建一个Retrofit 对象(核心用法一)
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())//解析方法
//这里建议:- Base URL: 总是以/结尾;- @Url: 不要以/开头
.baseUrl("http://www.wangyinews.com.cn/")
.build();- 接口申明(核心用法二)
public interface NewsService {
/**
* 根据newsid获取对应的资讯数据
* 如果不需要转换成Json数据,可以用了ResponseBody;
* @param newsId
* @return call
*/
@GET("News/{newsId}")
Call<News> getNews(@Path("newsId") String newsId);
}若需要重新定义接口地址可以使用@Url,例:
@GET
Call<List<CaigenActivitySubjectsBean>> getActivitySubjectsList(
@Url String url,
@QueryMap Map<String, String> map);- 创建访问API的请求(核心用法三)
NewsService api = retrofit.create(NewsService .class);
Call<News> call = service.getNews("123456");- 同步调用(核心用法四)
News news = call.execute();
- 异步调用(核心用法五)
call.enqueue(new Callback<News>(){
@Override
public void onResponse(Response<News> response) {
//成功返回数据后在这里处理,使用response.body();获取得到的结果
News news = response.body();
}
@Override
public voidonFailure(Throwable t) {
//请求失败在这里处理
}
});- 取消请求(核心用法六)
call.cancel();
- 完成以上步骤就可以实现一个简单的网络请求了。
Tips:
当返回结果错误,调用response.errorBody().string();可以得到String类型的请求结果,但再次调用response.errorBody().string();得到的结果为""。具体原因不明
- 创建实体类
【Android】Retrofit 2.0 的使用的更多相关文章
- Android Retrofit 2.0 使用-补充篇
推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...
- android -------- Retrofit + RxJava2.0 + Kotlin + MVP 开发的 WanAndroid 项目
简介 wanandroid项目基于 Retrofit + RxJava2.0 + Kotlin + MVP 用到的依赖 implementation 'io.reactivex.rxjava2:rxj ...
- Android Retrofit 2.0使用
实例带你了解Retrofit 2.0的使用,分享目前开发Retrofit遇到的坑和心得. 添加依赖 app/build.gradle 1 compile 'com.squareup.retrofit2 ...
- Android Retrofit 2.0文件上传
Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 使用Retrofit进行文件上传,肯定离不开Part & PartMap. public interface ...
- Android - Retrofit 2.0 使用教程(含实例讲解)
链接:https://blog.csdn.net/carson_ho/article/details/73732076
- Android:手把手带你深入剖析 Retrofit 2.0 源码
前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜 ...
- Retrofit 2.0 超能实践(四),完成大文件断点下载
作者:码小白 文/CSDN 博客 本文出自:http://blog.csdn.net/sk719887916/article/details/51988507 码小白 通过前几篇系统的介绍和综合运用, ...
- Retrofit 2.0 超能实践(三),轻松实现文件/多图片上传/Json字符串
文:http://blog.csdn.net/sk719887916/article/details/51755427 Tamic 简书&csdn同步 通过前两篇姿势的入门 Retrofit ...
- Retrofit 2.0 超能实践(一),okHttp完美支持Https传输
http: //blog.csdn.net/sk719887916/article/details/51597816 Tamic首发 前阵子看到圈子里Retrofit 2.0,RxJava(Andro ...
- Retrofit 2.0 超能实践,完美支持Https传输
http://blog.csdn.NET/sk719887916/article/details/51597816 前阵子看到圈子里Retrofit 2.0,RxJava(Android), OkHt ...
随机推荐
- shiro授权-记调试过程
根据张开涛老师的shiro教程学习过程中 感觉shiro授权这块有点绕 调试了十几遍 大概有个思路 记录一下 1.单元测试入口 2.subject().isPermitted("+user ...
- ubuntu 下更新pip后发生 ImportError: cannot import name 'main'的问题解决
今天刚使用ubuntu 由于安装的是pip 8的版本,我感觉pip版本有些低就随手将将pip更新了,刚新到pip 10版本的,没想到刚更新完就报错了, 发生 ImportError: cannot i ...
- Tomcat性能调优-让小猫飞奔
一.总结前一天的学习 从“第三天”的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü 吞吐量 ü Responsetime ü Cpuload ü MemoryUsa ...
- Android 7.0 FileProvider 使用说明
FileProvider FileProvider 这个组件在Android 22.0.0 (也就是 Android 5.0 ) 版本下加入进Android系统,该组件是ContentProvider ...
- IE6基本bug
一.IE6双倍边距bug当页面上的元素使用float浮动时,不管是向左还是向右浮动:只要该元素带有margin像素都会使该值乘以2,例如“margin-left:10px” 在IE6中,该值就会被解析 ...
- ES6-Object
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- PostgreSQL执行超时的问题
PostgreSQL执行超时的问题 使用背景 最近在使用PostgreSQL的时候,在执行一些数据库事务的时候,先后出现了statement timetout 和idle-in-transaction ...
- Hive和SparkSQL: 基于 Hadoop 的数据仓库工具
Hive: 基于 Hadoop 的数据仓库工具 前言 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,将类 SQL 语句转 ...
- Nodejs学习笔记(三)—模块
简介及资料 通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名') ...
- CentOS 7 安装 RabbitMQ 3.7
目录 CentOS 7 安装 RabbitMQ 3.7 安装Erlang 安装依赖 创建yum源 参考 添加内容 安装 进入erlang命令行表示成功 安装 socat RabbitMQ 安装 sys ...