浅谈我为什么选择用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库请求为例


声明接口

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);
时间: 2024-09-21 06:28:31

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

网络请求框架 Retrofit 2 使用入门

本文讲的是网络请求框架 Retrofit 2 使用入门, 你将要创造什么 Retrofit 是什么? Retrofit 是一个用于 Android 和 Java 平台的类型安全的网络请求框架.Retrofit 通过将 API 抽象成 Java 接口而让我们连接到 REST web 服务变得很轻松.在这个教程里,我会向你介绍如何使用这个 Android 上最受欢迎和经常推荐的网络请求库之一. 这个强大的库可以很简单的把返回的 JSON 或者 XML 数据解析成简单 Java 对象(POJO).GE

Android Retrofit和Rxjava的网络请求

Android  Retrofit和Rxjava的网络请求 去年的时候好多公司就已经使用Rxjava和Retrofit了,最近自自己学习了一下,感觉真的是很好用,让自己的网络请求变得更简单了,而且封装性极强. 首先做一下准备工作,导入需要引用的文件 compile 'com.android.support:appcompat-v7:25.1.0' testCompile 'junit:junit:4.12' compile 'io.reactivex:rxjava:1.1.0' compile

Android网络请求框架之Retrofit实践

网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的寻找更好的解决方案,到现在也没找到,不过据行业所说,Retrofit算是行业比较牛逼的开源请求框架了吧,也算找 到了一些更好的方案,在这里做些记录,也做共享. 下面是我们常用的mvp模式的运行模型: Retrofit:Square提供的开源产品,为Android平台的应用提供一个类型安全的REST客

Android网络请求框架Retrofit详解

介绍: Retrofit 是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求.本文使用Retrofit2.0.0版本进行实例演示. 使用Retrofit可以进行GET,POST,PUT,DELETE等请求方式. 同步请求:需要在子线程中完成,会阻塞主线程. Response response = call.execute().body(); 异步请求:请

浅谈广告单页(Landing Page)如何强化网络营销

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在站长论坛经常会看到一些老鸟说LP页面,LP其实是Landing Page的缩写,亦可称为登录页,说白了可以是任何一个接受流量的广告单页,目的是强化网络营销. 传统意义上的LP页面和Email营销有关,使用过电子邮箱的朋友都会有收到广告邮件的经历,邮件里面就是个漂亮的页面,邮件本身的目的就是营销.现在的LP页面和搜索引擎.付费流量等有关,为达

浅谈当下“天时、地利、人和”的网络贸易形势

中介交易 SEO诊断 淘宝客 云主机 技术大厅 企业和互联网,在十年前的中国根本是风马牛不相及的概念.一是因为,十年前的中国互联网还很不成熟,在多数人看来仍是个虚拟的概念,当然也有不少人已经开始造起了梦,但是前途未卜,与其说是创新还不如说是革命,革命是要流血的,所以那时死了一大批先驱者. 二是因为十年前的超市和商场的所有消费者都是直接用现金付款,绝大多数人对信用卡都不知为何物,没有信用卡的用户基础,支付问题就会成为电子商务无法解决的瓶颈,所以当时国内的电子商务市场也是很不成熟的. 三是因为十年前

选址攻略:浅谈数据中心选址 混合跨城域网络

像亚马逊,戴尔,谷 歌,微软和雅虎这些企业都将他们的大型内容数据中心设在华盛顿州.其中许多设施都位于一个名叫昆西的乡村小镇,因为该地区有水坝优势,能够提供低成本的绿色电力资源.同样,亚马逊在华盛顿的Umtilla建立了一处数据中心,以获得低成本水力发电.距离这些农村地区最近的城市西雅图和波特兰也有300公里,像其他远程数据中心一样,选址在这些地方的数据中心也面临着许多新的挑战,其中包括: 1.增加了跨区域带宽需求 随着数据内容的快速增长,正推动许多大型企业的数据中心必须实现跨城域,区域界限提供较

浅谈博客营销的价值(企业网络营销)

今天你写博客了吗?同学朋友之间经常互相问起,类似的问题.的确,博客(Blog)在几年,已经成为网名的网络生活的重要部分,博客在社会舆论层面.媒体影响层面.名人效应层面的作用也日渐强大.各大主流门户博客,逐渐成为人们生活表达.个性展示.思想碰撞的大舞台,也成为了名人生活事业的曝光台.这是,博客作为媒体属性的全面体现. 在企业端,博客没有娱乐名人那么火热,作为内容为王的博客,企业想有一番作为,绝非一朝一夕能够达成的.企业也要清醒的认识,博客营销的价值,才能有的放矢,持之以恒的去做.博客营销对于企业的

浅谈旅游网站通过QQ群来进来网络营销

中介交易 SEO诊断 淘宝客 云主机 技术大厅 通过QQ群来组织活动,自驾游.周末休闲游.团购等,兴起在这一两年,随着购车人群的增加,这部分有钱有闲的年轻一代,其实同时也是旅游网站的重要客户群体. 客户群体特征: 1.年龄在25岁到40岁之间,自购车,或亲人/朋友有车,喜欢旅游 2.对路况不熟悉,对旅游目的地情况不熟悉,有针对性的出行咨询的服务需要 3.有一定的消费能力,一年中有多次出游的支付能力 如何通过QQ群这种工具来进行旅游网站的产品营销?能否能过QQ群盈利,如何组建QQ群,如何进行线上线