比较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库请求为例


声明接口

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作为我的网络请求框架的更多相关文章

  1. django 浅谈CSRF(Cross-site request forgery)跨站请求伪造

    浅谈CSRF(Cross-site request forgery)跨站请求伪造(写的非常好) 本文目录 一 CSRF是什么 二 CSRF攻击原理 三 CSRF攻击防范 回到目录 一 CSRF是什么 ...

  2. 浅谈CSRF(Cross-site request forgery)跨站请求伪造

    目录 浅谈CSRF(Cross-site request forgery)跨站请求伪造 CSRF是什么 CSRF攻击原理 CSRF攻击防范 浅谈CSRF(Cross-site request forg ...

  3. 基于Retrofit+RxJava的Android分层网络请求框架

    目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及 ...

  4. 一步步搭建Retrofit+RxJava+MVP网络请求框架(二),个人认为这次封装比较强大了

    在前面已经初步封装了一个MVP的网络请求框架,那只是个雏形,还有很多功能不完善,现在进一步进行封装.添加了网络请求时的等待框,retrofit中添加了日志打印拦截器,添加了token拦截器,并且对Da ...

  5. Android 网络请求框架Retrofit

    Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp ...

  6. 安卓开发常用网络请求框架OkHttp、Volley、XUtils、Retrofit对比

    网络请求框架总结1.xutils     此框架庞大而周全,这个框架可以网络请求,同时可以图片加载,又可以数据存储,又可以 View 注解,使用这种框架很方便,这样会使得你整个项目对它依赖性太强,万一 ...

  7. 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)

    首先,展示一下封装好之后的项目的层级结构. 1.先创建一个RetrofitApiService.java package com.xdw.retrofitrxmvpdemo.http; import ...

  8. Android网络请求框架之Retrofit实践

    网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的 ...

  9. Android常用网络请求框架Volley Retrofit (okHttp)

    Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient.在 Android 5.0 的时候 Google 就不推荐使用 HttpClient ...

随机推荐

  1. lglob-lua 静态检查脚本

    ./lglob ~/ngx/lualib/mvc/*.lua 2>&1 | grep ' set '

  2. JBOSS EAP实战(1)

    JBOSS的诞生 1998年,在硅谷SUN公司的SAP实验室,一个年轻人正坐在电脑前面思考,然后写着什么东西.不,他没有在写程序,他在写辞呈.他正在做出人生的一个重大决定:他要辞掉在SUN的这份工作, ...

  3. Spark编译及spark开发环境搭建

    最近需要将生产环境的spark1.3版本升级到spark1.6(尽管spark2.0已经发布一段时间了,稳定可靠起见,还是选择了spark1.6),同时需要基于spark开发一些中间件,因此需要搭建一 ...

  4. Swift中方法(method)所谓的lazy绑定简介

    我们知道在ruby之类的动态语言中对象方法可以先从类中预先抽取,然后再应用到某个具体对象上.这称为无绑定的method对象,也可以叫做lazy绑定. 下面举个例子: irb(main):004:0&g ...

  5. Swift中方法闭包参数不能省略括号的一种情况

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在swift中,如果方法的最后一个参数是一个闭包类型, ...

  6. XMPP(二)-基于asmack+openfire的安卓客户端(仿QQ)的介绍以及个人心得

    关于XMPP第一篇-openfire的搭建写完后,就一直在赶本篇所要介绍的这个基于asmack+openfire的安卓客户端,费了不少精力,因为有不少同学在还在焦急的等待着(自恋了呵呵),所以紧赶慢赶 ...

  7. Hibernate缓存集成IMDG

    1 第三方缓存插件 除了Ehcache这种轻量级的缓存方案外,几乎所有IMDG产品都提供了对Hibernate二级缓存的直接支持,常用的有: Ø  Hazelcast Ø  GridGain Ø  J ...

  8. Android开发 无法导入ViewPagerIndicator或其他开源框架无法导入

    这个问题又花费了好长时间,其实就是很简单的问题,因为各种开源框架的库名称都叫liberary,如果上次导入其他开源框架没有更改名称的话,你再导入其他第三库的时候,系统发现重名,就提示无法导入现象. 解 ...

  9. 验证码程序Demo

    小伙伴都有这样的经历,册各种网站,总是输不对验证码,双十一那天狂买的小伙伴是不是对输入验证码有着不一样的感触呢,以前觉得验证码真是个麻烦鬼,一个不小心,一个眼拙,哎呦,没有输入正确,又是一阵子大眼瞪小 ...

  10. (Android自定义View)来来来,一起再撸一个Material风格loadingView。

    本文同步自博主的个人博客wing的地方酒馆 很久很久以前,撸了一款loadingview(点击这里回顾),当时觉得还不错,现在看看觉得好丑啊!!! 于是想再撸一个,无意间在这里看到一个很不错的效果,于 ...