安卓开发学习之Retrofit2.0的使用

介绍

Retrofit2.0是一个比较流行的网络开源库,可以用来进行同步或异步的网络请求,现在,我就通过例子(访问翻译词霸进行翻译)讲解的方式,给大家演示一下其基本用法


使用步骤

添加依赖
compile 'com.squareup.retrofit2:retrofit:2.0.2'
// Retrofit库
compile 'com.squareup.retrofit2:converter-gson:2.0.2'

一个是Retrofit库,一个是gson库


定义结果类

翻译词霸的结果格式是这样:

    status:翻译状态

    Content字段:翻译结果的封装:里面有from(原文语言)、to(翻译成哪种语言)、vendor(翻译提供者,就到底谁翻译的,有道还是谁)、out(翻译结果)、errNo(错误码,没错误则为0)


故而把结果类定义成下面的样子,里面封装一个内部类Content:

public class Result {
    private int status;

    private Content content;

    private class Content{
        private String from;
        private String to;
        private String vendor;
        private String out;
        private int errNo;

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("{");
            sb.append("\"from\":\"")
                    .append(from).append('\"');
            sb.append(",\"to\":\"")
                    .append(to).append('\"');
            sb.append(",\"vendor\":\"")
                    .append(vendor).append('\"');
            sb.append(",\"out\":\"")
                    .append(out).append('\"');
            sb.append(",\"errNo\":")
                    .append(errNo);
            sb.append('}');
            return sb.toString();
        }
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("{");
        sb.append("\"status\":")
                .append(status);
        sb.append(",\"content\":")
                .append(content.toString());
        sb.append('}');
        return sb.toString();
    }
}


定义请求接口

Retrofit里网络请求的执行,要先通过调用自定义接口里的方法获取一个Call对象,而后Call对象同步或异步执行请求。

所以我们要自定义请求接口,但要用上retrofit的注解

public interface IRequest {
    @GET("ajax.php")
    Call<Result> getResult(@Query("a") String a,@Query("f") String from
            ,@Query("t") String to,@Query("w") String w);
    //@Query用于在?之后传参
}

解释:@GET表示用get方法进行网络请求,里面的参数是相对地址,也可以用绝对地址,但不推荐那样,代码复用性不好

         Call<Result>网络请求完后,返回一个Call对象,这个是Retrofit中封装好的类,泛型特定化为自定义的Result

        方法参数列表,网络请求的参数,顺序不可打乱。以@Query("a") String a为例,意思是加上一个参数a,值是外界传来的String类型的a

        上面方法执行后,生成的url是:

                ajax.php?a=a&f=from&t=to&w=w


调用API进行网络请求
构造Retrofit对象

我们要用到Retrofit对象来开启网络请求,于是就要调用一系列的API

Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

解释:baseUrl()设定请求的基础URL,参数是我写的静态final字段BASE_URL

public static final String BASE_URL = "http://fy.iciba.com/";

        ConverterFactory:解析工厂,一般就直接用GSON,把返回的json数据解析成java对象

        CallAdapterFactory:直接用RxJava的工厂


构造请求接口对象
final IRequest request = retrofit.create(IRequest.class);

看源码的话,这儿是一个动态代理


调用接口方法,获取请求对象
Call<Result> call = request.getResult("fy", "auto", "auto", "I`m%20good%20to%go!");

按顺序传入参数,这样的话,请求URL就是:

    http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=I`m%20good%20to%20go!

    解释:a=fy,固定的

            f=auto:自动识别原文语言

            t=auto:默认译文语言是中文

            w=I`m%20good%2to%20go!:原文是I`m%20good%2to%20go!,网络请求中空格用%20代替


请求对象执行请求
call.enqueue(new Callback<Result>() {
            //enqueue():异步
            ...
        });

enqueue()方法执行异步请求,execute()则为同步

里面传入回调接口,处理请求后的回调


处理回调
 @Override
 public void onResponse(Call<Result> call, Response<Result> response) {
     int code = response.code();
     if (code == 200) {
         String result = response.body().toString();
         Log.i(TAG, result);
     } else {
         Log.i(TAG, "responseCode=" + code);
     }
 }

 @Override
 public void onFailure(Call<Result> call, Throwable t) {
     t.printStackTrace();
     dismissDialog();
 }

onResponse()是正常请求的结果回调,onFailure()是发生异常的回调

我们只看onResponse():

请求码成功的情况下,获取response.body()、也就是result对象


运行结果


可以看到,返回了正确结果。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值