基础请求URL:
public class BaseRequest {
public static final String BaseURL = “https://fanyi.youdao.com/”;
}
Retrofit的使用:
// Retrofit 实例的创建
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BaseRequest.BaseURL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
// 创建请求接口类
GetRequestInterface request = retrofit.create(GetRequestInterface.class);
// —普通网络请求—
// 获取请求对象Call
Call call = request.getCall();
// 执行网络请求
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
ResponseBody body = response.body();
Log.i(“TAG”, “MainActivity onResponse response:” + response.toString());
Log.i(“TAG”, “MainActivity onResponse body:” + (body == null ? “null” : body.toString()));
}
@Override
public void onFailure(Call call, Throwable t) {
Log.i(“TAG”, “MainActivity onFailure t:” + t.toString());
}
});
// —RxJava网络请求—
Observable observableCall = request.getObservableCall();
observableCall.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResultData resultData) {
Log.i(“TAG”, “retrofit onNext resultData:” + resultData.toString());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.i(“TAG”, "retrofit onComplete ");
}
});
主要分为几步:
(1)通过构造者模式创建Retrofit实例;
(2)通过动态代理创建接口的实例;
(3)通过接口的实例获取到网络请求的操作类Call;
(4)通过Call来执行网络请求;
看一下大致流程图:
下面我们基于使用来深入框架,探索其源码的精妙!
3、Retrofit的创建
3.1、Retrofit的变量
// Retrofit 实例的创建
Retrofit retrofit = new Retrofit.Builder()
// 创建baseUrl
.baseUrl(BaseRequest.BaseURL)
// 添加GsonConverterFactory
.addConverterFactory(GsonConverterFactory.create())
// 添加RxJava的RxJavaCallAdapterFactory
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
// 构建Retrofit的实例
.build();
Retrofit的构建使用了建造者模式,这个模式的优点就是可以构造复杂的对象,方便扩展,并且看起来代码比较简洁,美观;
在开始之前,我们先来看一下Retrofit的成员变量;
这里的变量并不是很多,我们来一个个分析;
**(1)Map<Method, ServiceMethod<?>> serviceMethodCache:**这是一个方法的缓存类,key为网络请求的Method,比如GET,POST等,而ServiceMethod则对应着动态代理解析后的方法类;
**(2)okhttp3.Call.Factory callFactory:**这个是创建OkHttp的工厂类;
**(3)HttpUrl baseUrl:**这个是基础URL,网络请求会带上这个基础URL;
**(4)List<Converter.Factory> converterFactories:**Converter.Factory的集合,Converter.Factory是将返回的数据通过这个工厂转化为对应的数据,比如Gson的GsonConverterFactory工厂类,也就是数据转化器工厂;
**(5)List<CallAdapter.Factory> callAdapterFactories:**CallAdapter.Factory的集合,CallAdapter.Factory是网络请求的适配器工厂,比如把Call转化为RxJava请求的RxJavaCallAdapterFactory工厂,也就是Call转化工厂;
**(6)Executor callbackExecutor:**用于回调网络请求;
**(7)boolean validateEagerly:**用于判断是否需要立即解析方法,这个我们在将动态代理的时候会讲到;
我们看完了Retrofit的成员变量,但是Retrofit的创建是通过Builder来创建的,下面我们来看看Retrofit的Builder的变量有哪些,分别有哪些作用;
4、Retrofit.Builder的创建
4.1、Retrofit.Builder的变量
从图片可以看出,和Retrofit的变量差不多,唯一有区分的就是多了Platform和validateEagerly变量,让我们通过源码来看看这两个是做什么的;
先来看一下这个Platform的赋值;
这个Platform是通过Platform.get()方法获取的,来看看这个方法是啥逻辑;
从图片可以看出,最终是调用的findPlatform()方法;
这个方法会返回Android,Java,Platform等类,主要是用来判断对于的平台,然后获取到对于的Platform;
private static Platform findPlatform() {
<