Retrofit 2.0 使用详解

2018-02-27  本文已影响0人  含笑小基石
Retrofit

官方教程

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


前言


简介

介绍

作者

功能

应用场景


原理

Retrofit其实是一个网络请求框架的封装,因为网络请求的工作本质上是 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

上一篇下一篇

猜你喜欢

热点阅读