一、Retrofit简介
Retrofit是现下Android端开发非常流行的一款网络请求框架,它通过动态代理的方式将Java接口翻译成网络请求,通过OkHttp发送请求,并且其具备强大的可扩展性,支持各种数据格式的转换以及RxJava。说到这里,我们来分析一下网络请求框架的本质,网络请求框架是一套提供给开发者使用的用于网络请求的API接口,我们知道,Android网络请求一般是基于Http协议的,而Http协议属于应用层的协议,具体的数据传输需要依赖传输层的TCP协议,Android系统提供了Socket编程接口给开发者建立TCP请求,所以具体数据的发送需要依赖Socket;Http协议属于应用层的协议,它是用来规定数据的传输格式的,用于传输双方都能按照固定的格式解读数据;所以,一个网络请求框架至少要包含以下几个功能:
1、提供接口给开发者传入请求参数;
2、编写Socket代码,建立TCP;
3、通过TCP连接,严格按照Http协议的格式将请求参数发送给服务端;
4、严格按照Http协议的格式解读服务端返回的数据;
5、提供相应的接口给开发者获得返回数据(一般是通过回调处理的)。
上面五点是一个网络请求框架必须具备的功能,当然,一个好的网络请求框架还应该具备如下特点:
1、提供给开发者使用的API尽可能简单;
2、添加了对网络缓存的处理,避免不必要的请求;
3、具有较高的性能;
4、具有较高的可扩展性。
我们常用的OkHttp、HttpURLConnection等网络请求框架,其内部就会将开发者传入的请求参数按照Http协议的格式组织好,并通过TCP连接发送给服务端,在收到服务端返回数据后,又会按照Http协议去解读数据,并提供相应的API(一般是回调)给开发者获得数据。由于OkHttp属于比较底层的网络请求框架,开发者在使用时还是会比较复杂,于是Retrofit对OkHttp进行了再度的封装,使得开发者在使用时更加的方便。
二、使用Retrofit请求网络数据的基本流程
1、在build中添加依赖
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
2、定义请求接口类
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
/**
* Created by dell on 2018/9/6.
*/
public interface TranslateApi {
@POST("ajax.php?a=fy&f=auto&t=auto")
@FormUrlEncoded
Call<TranslateBean> translateRequest(@Field("w") String input);
}
3、创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder() // 通过Builder模式构造一个Retrofit对象
.baseUrl("http://fy.iciba.com/") // 配置HOST
.addConverterFactory(GsonConverterFactory.create()) // 添加解读返回数据的对象,因为返回数据是Json格式的,所以这里采用GsonConverterFactory来解读
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 添加适配OkHttpCall对象的CallAdapterFactory
.build();
4、根据请求接口生成具体的请求实体对象
TranslateApi translateApi = retrofit.create(TranslateApi.class); // 传入定义的接口,获得一个实现了TranslateApi接口的实体对象
5、调用请求对象的请求方法生成能够发起网络请求的Call对象
Call<TranslateBean> call = translateApi.translateRequest(mInputEditText.getText().toString()); // 调用请求方法,返回一个Call对象
6、调用Call对象的enqueue方法发起异步网络请求
call.enqueue(new Callback<TranslateBean>() { // 调用Call对象的enqueue方法发起异步网络请求,enqueue方法需要传入一个Callback对象,用来处理网络请求的回调
@Override
public void onResponse(Call<TranslateBean> call, Response<TranslateBean> response) { // 网络请求正确的回调
TranslateBean translateBean = response.body(); // 处理返回结果
if (translateBean.getContent().getOut() != null) {
mOutputText.setText(translateBean.getContent().getOut());
} else {
mOutputText.setText(translateBean.getContent().getWordMeanString());
}
}
@Override
public void onFailure(Call<TranslateBean> call, Throwable t) { // 网络请求错误的回调
mOutputText.setText("翻译出错了!");
}
总结一下,首先我们定义了网络请求的接口,接口中配置了请求的基本信息,包括请求方法、请求参数等;接着我们生成了一个Retrofit对象,在这里可以配置请求的默认Host信息、添加解析返回数据格式的Factory、添加适配OkHttpCall的Factory等功能;然后调用retrofit对象的create方法,传入网络请求接口类,生成一个具体的网络请求实体对象;接下来我们调用了请求方法生成一个能够发起网络请求的Call对象,最后调用Call对象的enquene方法将发起异步的网络请求,并且在传入的Callback中处理网络请求的回调。
三、Retrofit原理分析
从上面的使用方法可以看出,Retrofit的核心是根据接口生成一个能够发起网络请求的对象,然后根据这个对象再发起网络请求
1、生成Retrofit对象
public Retrofit build() {
if (baseUrl == null) {
throw new IllegalStateException("Base URL required.");
}
okhttp3.Call.Factory callFactory = this.callFactory;
if (callFactory == null) {
callFactory = new OkHttpClient(); // 如果没有设置网络请求框架,模式使用OkHttp处理网络请求
}
Executor callbackExecutor = this.callbackExecutor;
if (callbackExecutor == null) {
callbackExecutor = platform.defaultCallbackExecutor(); // 默认使用platform.defaultCallbackExecutor()处理返回结果
}
// Make a defensive copy of the adapters and add the default Call adapter.
List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
adapterFactories.add(platform


2847

被折叠的 条评论
为什么被折叠?



