浅谈我为什么选择用Retrofit作为我的网络请求框架

标签: 选择 retrofit 作为 | 发表时间:2016-07-21 16:34 | 作者:xiangzhihong8
出处:http://blog.csdn.net

比较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

/**
 * Created by xemenes on 25/03/16.
 */
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);


作者:xiangzhihong8 发表于2016/7/21 8:34:29 原文链接
阅读:18 评论:0 查看评论

相关 [选择 retrofit 作为] 推荐:

浅谈我为什么选择用Retrofit作为我的网络请求框架

- - CSDN博客推荐文章
比较AsyncTask、Volley、Retrofit三者的请求时间. Retrofit2.0 完胜. 地址: http://ip.taobao.com/service/getIpInfo.php. //@Query注解的作用理解为查询条件,这里表示需要查询的字段为ip. //ResponseBody是Retrofit自带的返回类,.

Retrofit全攻略——进阶篇

- - CSDN博客推荐文章
最近事比较多,距离上次写文章已经过去了一个月了. 上一篇文章 Retrofit全攻略——基础篇 介绍了Retrofit的基础用法,这篇文章介绍点进阶的用法. 在开发阶段,为了方便调试,我们需要查看网络日志. 因为 Retrofit2.0+底层是采用的 OKHttp请求的. 可以给OKHttp设置拦截器,用来打印日志.

Rxjava+ReTrofit+okHttp深入浅出-终极封装

- - CSDN博客推荐文章
Rxjava+ReTrofit+okHttp深入浅出-终极封装. 学习Rxjava和retrofit已经很长时间了,功能确实很强大,但是使用起来还是有点复杂,代码的重复性太高,所以决定把基于retrofit和rxjava的处理统一封装起来,实现的功能:. 1.Retrofit+Rxjava+okhttp基本使用方法.

这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)

- - CSDN博客移动开发推荐文章
在 Andrroid开发中,网络请求十分常用. 而在 Android网络请求库中, Retrofit是当下最热的一个网络请求库. 今天,我将献上一份非常详细 Retrofit v2.0的使用教程,希望你们会喜欢. 如果对 Retrofit v2.0的源码感兴趣,可看文章: Android:手把手带你深入剖析 Retrofit 2.0 源码.

游戏设计不宜作为新手入行职业选择

- - GamerBoom.com 游戏邦
作者:Jacob Stevens. 高中毕业时,我的数学老师送给我们几句话,“班上所有女生都想要成为海洋生物学家,所有男生都想要制作电子游戏. ”当然他这么说有些夸张,但他的观点无可非议:所有光鲜靓丽的事业都是靠来之不易的专业技术支撑的. 回到10年前,我自己被迫不得不给出相同的忠告. 作为家乡为数不多的开发者之一,我时常被问及要如何“进入游戏设计行业”.

转载 选择

- bravusliu - caowumao的博客

CSS4 选择器

- iVane - 幸福收藏夹
CSS3 还没完全用上,CSS4 已经提上日程. 官方发布了 update to the working Selectors Level 4 spec,对选择器做了一些升级. 前端最大的优点就是技术更新快,可以经常学到新东西;最大的缺点也是技术更新快,要跟上潮流还真不是那么简单. 不过,这次更新有像“父选择器”这样让人兴奋的内容,让我们先睹为快,了解一下吧:.

JQuery 选择器

- - CSDN博客Web前端推荐文章
}

点击我

.    像上面这样把JavaSript代码和HTML代码混杂在一起的做法同样也非常不妥,因为它并没有将网页内容和行为分离,所以才有JQuery选择器的学习.

点击我

. //给class为demo的元素添加行为.

选择性闭嘴

- 蓓 - 土摩托日记
除了熟人之外,文青博客我追看的不多,总数不会超过10个,因为大多数这类博客的营养都欠奉. 一个是连岳,他的感情QA还是挺好看的,某些政论文字也还不错. 但这厮喜欢掺和科学的事儿,不止一次误导过读者. 就拿地震预报来说吧,他哪有资格评论. 看看这个报道,今天距离这则报道正好过去了两个月,可预报的地震仍然没有发生.

mysql选择索引

- - CSDN博客数据库推荐文章
1、尽量为用来搜索、分类或分组的数据列编制索引,不要为作为输出显示的数据列编制索引. 最适合有索引的数据列是那些在where子句中数据列,在联结子句中出现的数据列,或者是在Group by 、Order by子句中出现的数据列. select 后的数据列最好不要用索引. 2、综合考虑各数据列的维度.