Android:这是一份全面 & 详细的Retrofit 2(2)

private static final Platform PLATFORM = findPlatform();

// 将findPlatform()赋给静态变量

static Platform get() {

return PLATFORM;

// 返回静态变量PLATFORM,即findPlatform() ->>步骤3

}

<-- 步骤3 -->

private static Platform findPlatform() {

try {

Class.forName(“android.os.Build”);

// Class.forName(xxx.xx.xx)的作用:要求JVM查找并加载指定的类(即JVM会执行该类的静态代码段)

if (Build.VERSION.SDK_INT != 0) {

return new Android();

// 此处表示:如果是Android平台,就创建并返回一个Android对象 ->>步骤4

}

} catch (ClassNotFoundException ignored) {

}

try {

// 支持Java平台

Class.forName(“java.util.Optional”);

return new Java8();

} catch (ClassNotFoundException ignored) {

}

try {

// 支持iOS平台

Class.forName(“org.robovm.apple.foundation.NSObject”);

return new IOS();

} catch (ClassNotFoundException ignored) {

}

// 从上面看出:Retrofit2.0支持3个平台:Android平台、Java平台、IOS平台

// 最后返回一个Platform对象(指定了Android平台)给Builder的有参构造方法public Builder(Platform platform) --> 步骤5

// 说明Builder指定了运行平台为Android

return new Platform();

}

}

<-- 步骤4 -->

// 用于接收服务器返回数据后进行线程切换在主线程显示结果

static class Android extends Platform {

@Override

CallAdapter.Factory defaultCallAdapterFactory(Executor callbackExecutor) {

return new ExecutorCallAdapterFactory(callbackExecutor);

// 创建默认的网络请求适配器工厂

// 该默认工厂生产的 adapter 会使得Call在异步调用时在指定的 Executor 上执行回调

// 在Retrofit中提供了四种CallAdapterFactory: ExecutorCallAdapterFactory(默认)、GuavaCallAdapterFactory、Java8CallAdapterFactory、RxJavaCallAdapterFactory

// 采用了策略模式

}

@Override

public Executor defaultCallbackExecutor() {

// 返回一个默认的回调方法执行器

// 该执行器作用:切换线程(子->>主线程),并在主线程(UI线程)中执行回调方法

return new MainThreadExecutor();

}

static class MainThreadExecutor implements Executor {

private final Handler handler = new Handler(Looper.getMainLooper());

// 获取与Android 主线程绑定的Handler

@Override

public void execute(Runnable r) {

handler.post®;

// 该Handler是上面获取的与Android 主线程绑定的Handler

// 在UI线程进行对网络请求返回数据处理等操作。

}

}

// 切换线程的流程:

// 1. 回调ExecutorCallAdapterFactory生成了一个ExecutorCallbackCall对象

//2. 通过调用ExecutorCallbackCall.enqueue(CallBack)从而调用MainThreadExecutor的execute()通过handler切换到主线程

}

// 下面继续看步骤5的Builder有参构造方法

<-- 步骤5 -->

// Builder类的构造函数2(有参)

public Builder(Platform platform) {

// 接收Platform对象(Android平台)

this.platform = platform;

// 通过传入BuiltInConverters()对象配置数据转换器工厂(converterFactories)

// converterFactories是一个存放数据转换器Converter.Factory的数组

// 配置converterFactories即配置里面的数据转换器

converterFactories.add(new BuiltInConverters());

// BuiltInConverters是一个内置的数据转换器工厂(继承Converter.Factory类)

// new BuiltInConverters()是为了初始化数据转换器

}

对Builder类分析完毕,总结:Builder设置了默认的

  • 平台类型对象:Android

  • 网络请求适配器工厂:CallAdapterFactory

CallAdapter用于对原始Call进行再次封装,如Call到Observable

  • 数据转换器工厂: converterFactory

  • 回调执行器:callbackExecutor

特别注意,这里只是设置了默认值,但未真正配置到具体的Retrofit类的成员变量当中

步骤3

还是按部就班按步骤来观看

<-- 步骤1 -->

public Builder baseUrl(String baseUrl) {

// 把String类型的url参数转化为适合OKhttp的HttpUrl类型

HttpUrl httpUrl = HttpUrl.parse(baseUrl);

// 最终返回带httpUrl类型参数的baseUrl()

// 下面继续看baseUrl(httpUrl) ->> 步骤2

return baseUrl(httpUrl);

}

<-- 步骤2 -->

public Builder baseUrl(HttpUrl baseUrl) {

//把URL参数分割成几个路径碎片

List pathSegments = baseUrl.pathSegments();

// 检测最后一个碎片来检查URL参数是不是以"/"结尾

// 不是就抛出异常

if (!“”.equals(pathSegments.get(pathSegments.size() - 1))) {

throw new IllegalArgumentException("baseUrl must end in /: " + baseUrl);

}

this.baseUrl = baseUrl;

return this;

}

  • 至此,步骤3分析完毕

  • 总结:baseUrl()用于配置Retrofit类的网络请求url地址

将传入的String类型url转化为适合OKhttp的HttpUrl类型的url

步骤4

我们从里往外看,即先看GsonConverterFactory.creat()

public final class GsonConverterFactory extends Converter.Factory {

<-- 步骤1 -->

public static GsonConverterFactory create() {

// 创建一个Gson对象

return create(new Gson()); ->>步骤2

}

<-- 步骤2 -->

public static GsonConverterFactory create(Gson gson) {

// 创建了一个含有Gson对象实例的GsonConverterFactory

return new GsonConverterFactory(gson); ->>步骤3

}

private final Gson gson;

<-- 步骤3 -->

private GsonConverterFactory(Gson gson) {

if (gson == null) throw new NullPointerException(“gson == null”);

this.gson = gson;

}

  • 所以,GsonConverterFactory.creat()是创建了一个含有Gson对象实例的GsonConverterFactory,并返回给addConverterFactory()

  • 接下来继续看:addConverterFactory()

// 将上面创建的GsonConverterFactory放入到 converterFactories数组

// 在第二步放入一个内置的数据转换器工厂BuiltInConverters()后又放入了一个GsonConverterFactory

public Builder addConverterFactory(Converter.Factory factory) {

converterFactories.add(checkNotNull(factory, “factory == null”));

return this;

}

  • 至此,分析完毕

  • 总结:步骤4用于创建一个含有Gson对象实例的GsonConverterFactory并放入到数据转换器工厂converterFactories里

  1. 即Retrofit默认使用Gson进行解析
  1. 若使用其他解析方式(如Json、XML或Protocobuf),也可通过自定义数据解析器来实现(必须继承 Converter.Factory)

步骤5

终于到了最后一个步骤了。

public Retrofit build() {

<-- 配置网络请求执行器(callFactory)–>

okhttp3.Call.Factory callFactory = this.callFactory;

// 如果没指定,则默认使用okhttp

// 所以Retrofit默认使用okhttp进行网络请求

if (callFactory == null) {

callFactory = new OkHttpClient();

}

<-- 配置回调方法执行器(callbackExecutor)–>

Executor callbackExecutor = this.callbackExecutor;

// 如果没指定,则默认使用Platform检测环境时的默认callbackExecutor

// 即Android默认的callbackExecutor

if (callbackExecutor == null) {

callbackExecutor = platform.defaultCallbackExecutor();

}

<-- 配置网络请求适配器工厂(CallAdapterFactory)–>

List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);

// 向该集合中添加了步骤2中创建的CallAdapter.Factory请求适配器(添加在集合器末尾)

adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));

// 请求适配器工厂集合存储顺序:自定义1适配器工厂、自定义2适配器工厂…默认适配器工厂&

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值