官方教程
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接口。主要体现在:
- 用于描述网络请求的接口的设置
// 传统方式:Call<..>接口形式
@GET("url地址"``)
Call<Translation> getCall();
// RxJava 方式:Observable<..>接口形式
@GET("url地址")
Observable<Translation> getCall();
- 网络请求的封装形式 & 发送形式
/**
* 传统方式
*/
// 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, "请求成功");
}
});
}
网友评论