浅谈我为什么选择用Retrofit作为我的网络请求框架
比较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);
浅谈我为什么选择用Retrofit作为我的网络请求框架的更多相关文章
- django 浅谈CSRF(Cross-site request forgery)跨站请求伪造
		浅谈CSRF(Cross-site request forgery)跨站请求伪造(写的非常好) 本文目录 一 CSRF是什么 二 CSRF攻击原理 三 CSRF攻击防范 回到目录 一 CSRF是什么 ... 
- 浅谈CSRF(Cross-site request forgery)跨站请求伪造
		目录 浅谈CSRF(Cross-site request forgery)跨站请求伪造 CSRF是什么 CSRF攻击原理 CSRF攻击防范 浅谈CSRF(Cross-site request forg ... 
- 基于Retrofit+RxJava的Android分层网络请求框架
		目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及 ... 
- 一步步搭建Retrofit+RxJava+MVP网络请求框架(二),个人认为这次封装比较强大了
		在前面已经初步封装了一个MVP的网络请求框架,那只是个雏形,还有很多功能不完善,现在进一步进行封装.添加了网络请求时的等待框,retrofit中添加了日志打印拦截器,添加了token拦截器,并且对Da ... 
- Android 网络请求框架Retrofit
		Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp ... 
- 安卓开发常用网络请求框架OkHttp、Volley、XUtils、Retrofit对比
		网络请求框架总结1.xutils 此框架庞大而周全,这个框架可以网络请求,同时可以图片加载,又可以数据存储,又可以 View 注解,使用这种框架很方便,这样会使得你整个项目对它依赖性太强,万一 ... 
- 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)
		首先,展示一下封装好之后的项目的层级结构. 1.先创建一个RetrofitApiService.java package com.xdw.retrofitrxmvpdemo.http; import ... 
- Android网络请求框架之Retrofit实践
		网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的 ... 
- Android常用网络请求框架Volley Retrofit (okHttp)
		Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient.在 Android 5.0 的时候 Google 就不推荐使用 HttpClient ... 
随机推荐
- 有没有最好的学习Angularjs2的视频入门体验?
			Which are the best video tutorials for learning AngularJS 2? 有没有最好的学习Angularjs2的视频入门体验? 翻译来源:https:/ ... 
- Windows编译ejabberd
			Windows编译ejabberd(金庆的专栏)安装 erlang OTP. 添加路径到 PATH, 使 erl 可以运行.git clone ejabberd安装 rebar:git clone g ... 
- C++语言编译系统提供的内部数据类型的自动隐式转换
			C++语言编译系统提供的内部数据类型的自动隐式转换规则如下: 程序在执行算术运算时,低类型自动隐式转换为高类型. 在函数调用时,将实参值赋给形参,系统隐式的将实参转换为形参的类型,并赋值给形参. 函数 ... 
- 程序员的自我修养-----Java开发的必须知道的几个注意点
			1. 将一些需要变动的配置写在属性文件中 比如,没有把一些需要并发执行时使用的线程数设置成可在属性文件中配置.那么你的程序无论在DEV环境中,还是TEST环境中,都可以顺畅无阻地运行,但是一旦部署在P ... 
- JDBC编程-事务编程(四)
			事务的概念 事务的概念在我看来是指的是一组sql序列,这个序列是一块执行的单位,要么全部执行,要不全部执行,这样可以很好的对数据库进行并发控制. 因为数据库是多个用户都可以同时操作的,如果多个用户同时 ... 
- 剑指Offer--图的操作
			剑指Offer–图的操作 前言 企业笔试过程中会涉及到数据结构的方方面面,现将有关图的深度优先搜索与广度优先搜索进行整理归纳,方便日后查阅. 在已做过的笔试题目中,可用DFS解决的题目有: & ... 
- 因 URL 意外地以“/HelloWorld”结束,请求格式无法识别
			http://www.cnblogs.com/AngelLee2009/p/3540527.html 
- SpriteBuilder中使用GUI界面快速搭建RPG游戏中的地图名显示动画
			大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在RPG游戏中我们在进入一个新的场景时,比如一个房间,一个村庄, ... 
- 2、MyEclipse和Eclipse调优,MyEclipse配置(tomcat和jdk的内存设置),jar引入相关知识点,将Java项目编程web项目的办法
			1.WindowàPreferenceàGeneralàWorkspaceàText file encoding都改成UTF-8 2.WindowàPreferenceàGeneralàEdito ... 
- Android:android sdk源码中怎么没有httpclient的源码了
			欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 今天想使用这个API,怎么也找不到.废了好多时间... 查阅资料才知道如下解释: 在android 6.0(API 23)中,G ... 
