美文网首页
Retrofit 2.0 使用详解

Retrofit 2.0 使用详解

作者: 含笑小基石 | 来源:发表于2018-02-27 15:16 被阅读0次
    Retrofit

    官方教程

    http://square.github.io/retrofit/


    前言

    • 在Android开发中,网络请求十分常见
    • 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库

    简介

    介绍

    • 基于OKHttp的RESTful的网络请求框架的封装

    作者

    • Square

    功能

    • 基于OkHttp
    • 遵循RESTful API设计风格
    • 通过注解配置网络请求参数
    • 支持同步/异步网络请求操作
    • 支持多种数据的解析(Json、Gson、XML等)
    • 提供对RxJava的支持

    应用场景

    • 任何网络请求(特别是API遵循RESTful设计风格/使用RxJava进行异步操作)

    原理

    Retrofit其实是一个网络请求框架的封装,因为网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装。


    Retrofit原理
    • App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。
    • 在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析。

    注解说明

    注解说明

    Retrofit的使用案例

    在Gradle加入Retrofit库的依赖

    dependencies {
      compile 'com.squareup.retrofit2:retrofit:2.3.0'
      compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
      compile 'io.reactivex.rxjava2:rxjava:2.1.7'
      compile 'com.squareup.retrofit2:converter-gson:2.3.0'
      compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    }
    

    在AndroidManifest添加网络权限

    <uses-permission android:name=``"android.permission.INTERNET"/>
    

    创建接收服务器返回数据的类

    服务器返回的json数据

    这是金山词霸API服务器返回的json数据

    public class Translation {
    
        private String TAG = "Translation";
    
        private int status;
    
        private content content;
    
        private static class content {
            private String ph_am;
            private String ph_am_mp3;
            private String ph_en;
            private String ph_tts_mp3;
            private List<String> word_mean;
        }
    
        //定义 输出返回数据 的方法
        public void show() {
            Log.d(TAG, status + "");
    
            Log.d(TAG, content.ph_am);
            Log.d(TAG, content.ph_am_mp3);
            Log.d(TAG, content.ph_en);
            Log.d(TAG, content.ph_tts_mp3);
            Log.d(TAG, content.word_mean + "");
        }
    
    }
    

    创建用于描述网络请求的接口

    public interface GetTranslationInterface {
        // 注解里传入网络请求的部分URL地址
        @GET("ajax.php?a=fy&f=auto&t=auto&w=hello")
        // getCall()是接受网络请求数据的方法
        Observable<Translation> getCall();
    }
    

    这里是interface不是class,所以我们是无法直接调用该方法,我们需要用Retrofit创建一个GetTranslationInterface的代理对象。

    进行Retrofit网络访问

    /**
     * 创建Retrofit实例时需要通过Retrofit.Builder,并调用baseUrl方法设置URL。
     * Retrofit2的baseUlr 必须以 /(斜线)结束,不然会抛出一个IllegalArgumentException
     */
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url
            .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
            .build();
    
    /**
     * 创建网络请求接口的实例
     * 拿到代理对象
     */
    GetTranslationInterface request = retrofit.create(GetTranslationInterface.class);
    
    // 封装请求
    Call<Translation> call = request.getCall();
    
    // 发送网络请求(异步)
    call.enqueue(new Callback<Translation>() {
        @Override
        public void onResponse(Call<Translation> call, Response<Translation> response) {
            response.body().show();
        }
    
        @Override
        public void onFailure(Call<Translation> call, Throwable t) {
            Log.d(TAG, "failed");
        }
    });
    

    输出结果:

    输出结果

    Retrofit与RxJava的结合使用

    retrofit之所以作为现在最流行的网络请求库,其中一个主要原因是:支持RxJava

    两种方式在使用上最大的区别在于:传统方式采用了 Callback 接口,而RxJava 方式则采用了Observable接口。主要体现在:

    1. 用于描述网络请求的接口的设置
    // 传统方式:Call<..>接口形式
    @GET("url地址"``)
    Call<Translation> getCall();
    
    //  RxJava 方式:Observable<..>接口形式
    @GET("url地址")
    Observable<Translation> getCall();
    
    1. 网络请求的封装形式 & 发送形式
    /**
     * 传统方式
     */
        // 1. 创建网络请求接口的实例
        GetTranslationInterface request = retrofit.create(GetTranslationInterface.class);
    
        // 2. 采用Call<..>接口对发送请求进行封装
        Call<Translation> call = request.getCall();
    
        // 3. 发送网络请求(异步)
        call.enqueue(new Callback<Translation>() {
            // 请求成功时回调
            @Override
            public void onResponse(Call<Translation> call, Response<Translation> response) {
                ...
            }
    
            // 请求失败时回调
            @Override
            public void onFailure(Call<Translation> call, Throwable throwable) {
                ....
            }
        });
    
    /**
     * RxJava 版方式
     */
         // 1. 创建网络请求接口的实例
         GetTranslationInterface request = retrofit.create(GetTranslationInterface.class);
    
         // 2. 采用Observable<...>形式对网络请求进行封装
         Observable<Translation> observable = request.getCall();
    
         // 3. 发送网络请求(异步)
         observable.subscribeOn(Schedulers.io())               // 在IO线程进行网络请求
            .observeOn(AndroidSchedulers.mainThread())  // 回到主线程 处理请求结果
            .subscribe(new Observer<Translation>() {
                 // 发送请求后调用该复写方法(无论请求成功与否)
                 @Override
                 public void onSubscribe(Disposable d) {
                     ...// 初始化工作
                 }
    
                 // 发送请求成功后调用该复写方法
                 @Override
                 public void onNext(Translation translation) {
                     ...// 对返回结果Translation类对象进行处理
                 }
    
                 // 发送请求成功后,先调用onNext()再调用该复写方法
                 @Override
                 public void onComplete() {
                     Log.d(TAG, "请求成功");
                 }
                 // 发送请求失败后调用该复写方法
                 @Override
                 public void onError(Throwable e) {
                     Log.d(TAG, "请求失败");
                 }
             });
         }
    

    使用RxJava修改之前的异步网络请求代码

            // 创建Retrofit对象
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://fy.iciba.com/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
    
            // 创建网络请求接口的实例
            GetTranslationInterface request = retrofit.create(GetTranslationInterface.class);
    
            // 封装请求
            Observable<Translation> observable = request.getCall();
    
            // 发送网络请求,子线程请求,主线程更新
            observable.subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Translation>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                            Log.d(TAG, "开始采用subscribe连接");
                        }
    
                        @Override
                        public void onNext(Translation translation) {
                            translation.show();
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            Log.d(TAG, "请求失败");
                        }
    
                        @Override
                        public void onComplete() {
                            Log.d(TAG, "请求成功");
                        }
                    });
    
        }
    

    输出结果:

    输出结果

    参考文档:

    http://blog.csdn.net/carson_ho/article/details/73732076

    相关文章

      网友评论

          本文标题:Retrofit 2.0 使用详解

          本文链接:https://www.haomeiwen.com/subject/aempxftx.html