济南 网站建设,wordpress如何网页浏览数据库,做前端的女生压力大吗,公司网站建设费文章目录 Retrofit类Builder内部类baseUrl()addConverterFactory()client() 对retrofit的创造实例过程进行源码剖析。
在说之前#xff0c;介绍一个api#xff0c;用于判断对象是否为空#xff0c;然后执行#xff0c;否则抛出异常#xff0c;该api在下边很多地方都会出现… 文章目录 Retrofit类Builder内部类baseUrl()addConverterFactory()client() 对retrofit的创造实例过程进行源码剖析。
在说之前介绍一个api用于判断对象是否为空然后执行否则抛出异常该api在下边很多地方都会出现 public static T T requireNonNull(T obj, String message) {if (obj null)throw new NullPointerException(message);return obj;}
//用法Objects.requireNonNull(obj, obj null);Retrofit类
public final class Retrofit {// 网络请求配置对象对网络请求接口中方法注解进行解析后得到的对象// 作用存储网络请求相关的配置如网络请求的方法、数据转换器、网络请求适配器、网络请求工厂、基地址等private final MapMethod, ServiceMethod? serviceMethodCache new ConcurrentHashMap();// Call.Factory 实例用于生产网络请求器发送网络请求。默认使用的是okhttpfinal okhttp3.Call.Factory callFactory;// API 的基础 URL 地址final HttpUrl baseUrl;// Converter.Factory 实例的列表用于序列化和反序列化对象final ListConverter.Factory converterFactories;// CallAdapter.Factory 实例的列表用于支持不同于 Call 的返回类型final ListCallAdapter.Factory callAdapterFactories;// 回调方法执行的 Executorfinal Nullable Executor callbackExecutor;// 是否在创建 Retrofit 实例时进行配置验证final boolean validateEagerly;省略构造函数...
Builder内部类
Builder类的成员变量与Retrofit类的成员变量是对应的所以Retrofit类的成员变量基本上是通过Builder类的链式调用方法进行配置
public static final class Builder {private Platform platform; // 平台对象private okhttp3.Call.Factory callFactory; // 网络请求的 Call.Factoryprivate HttpUrl baseUrl; // API 的基础 URL 地址private ListConverter.Factory converterFactories new ArrayList(); // 数据转换器工厂列表private ListCallAdapter.Factory adapterFactories new ArrayList(); // 适配器工厂列表private Executor callbackExecutor; // 回调方法执行器private boolean validateEagerly; // 是否提前验证// 构造函数public Builder() {this(Platform.get()); // 使用 Platform.get() 初始化 Builder↓}// 获取平台对象static Platform get() {return PLATFORM;}// Builder 的有参构造函数public Builder(Platform platform) {this.platform platform; // 设置平台对象(Android)// converterFactories是一个存放数据转换器Converter.Factory的数组,下边添加数据转换器converterFactories.add(new BuiltInConverters()); // 初始化数据转换器工厂,// BuiltInConverters是一个内置的数据转换器工厂继承Converter.Factory类}
}
那么我们调用构造函数时就会调用有参构造函数参数最终是PLATFORM这个参数在Platform类中已经定义
class Platform {private static final Platform PLATFORM findPlatform();static Platform get() {return PLATFORM;}// 查找适合的平台private static Platform findPlatform() {// 判断当前平台是否为 DalvikAndroidreturn Dalvik.equals(System.getProperty(java.vm.name))? new Android() // 如果是 Android 平台则返回 Android 对象: new Platform(true); // 否则返回一个默认的 Platform 对象}/*下面的可以不用看,直到内部类Android*/// 是否支持 Java 8 类型private final boolean hasJava8Types;// MethodHandle 的构造函数private final Nullable ConstructorLookup lookupConstructor;// 构造函数Platform(boolean hasJava8Types) {this.hasJava8Types hasJava8Types;// 初始化 lookupConstructorConstructorLookup lookupConstructor null;if (hasJava8Types) {try {// 获取 MethodHandle 的构造函数lookupConstructor Lookup.class.getDeclaredConstructor(Class.class, int.class);lookupConstructor.setAccessible(true); // 设置为可访问} catch (NoClassDefFoundError ignored) {// 对于 Android API 24 或 25Lookup 类不存在无法调用默认方法} catch (NoSuchMethodException ignored) {// 假设 JDK 14修复了默认方法的问题}}this.lookupConstructor lookupConstructor;}// 获取默认的回调方法执行器NullableExecutor defaultCallbackExecutor() {return null;}// 获取默认的网络请求适配器工厂列表List? extends CallAdapter.Factory defaultCallAdapterFactories(Nullable Executor callbackExecutor) {DefaultCallAdapterFactory executorFactory new DefaultCallAdapterFactory(callbackExecutor);return hasJava8Types? asList(CompletableFutureCallAdapterFactory.INSTANCE, executorFactory): singletonList(executorFactory);}// 获取默认的网络请求适配器工厂列表的大小int defaultCallAdapterFactoriesSize() {return hasJava8Types ? 2 : 1;}// 获取默认的数据转换器工厂列表List? extends Converter.Factory defaultConverterFactories() {return hasJava8Types ? singletonList(OptionalConverterFactory.INSTANCE) : emptyList();}// 获取默认的数据转换器工厂列表的大小int defaultConverterFactoriesSize() {return hasJava8Types ? 1 : 0;}// 判断方法是否为默认方法IgnoreJRERequirement // 仅在 API 24 上调用boolean isDefaultMethod(Method method) {return hasJava8Types method.isDefault();}// 调用默认方法IgnoreJRERequirement // 仅在 API 26 上调用NullableObject invokeDefaultMethod(Method method, Class? declaringClass, Object object, Object... args)throws Throwable {Lookup lookup lookupConstructor ! null? lookupConstructor.newInstance(declaringClass, -1 /* trusted */): MethodHandles.lookup();return lookup.unreflectSpecial(method, declaringClass).bindTo(object).invokeWithArguments(args);}// Android 平台的实现继承自 Platform。//用于接收服务器返回数据后进行线程切换在主线程显示结果static final class Android extends Platform {Android() {super(Build.VERSION.SDK_INT 24);}// 获取默认的回调方法执行器Overridepublic Executor defaultCallbackExecutor() {return new MainThreadExecutor();// 返回一个默认的回调方法执行器// 作用切换线程子-主线程并在UI线程中执行回调方法}// 调用默认方法NullableOverrideObject invokeDefaultMethod(Method method, Class? declaringClass, Object object, Object... args) throws Throwable {if (Build.VERSION.SDK_INT 26) {throw new UnsupportedOperationException(Calling default methods on API 24 and 25 is not supported);}return super.invokeDefaultMethod(method, declaringClass, object, args);}// Android 平台的主线程执行器static final class MainThreadExecutor implements Executor {private final Handler handler new Handler(Looper.getMainLooper());// 该Handler是上面获取的与Android UI线程绑定的Handler Overridepublic void execute(Runnable r) {handler.post(r);// 在UI线程进行对网络请求返回数据处理等操作。}}}
}
baseUrl()
我们通常调用该函数填入的都是String类型 public Builder baseUrl(String baseUrl) {Objects.requireNonNull(baseUrl, baseUrl null);return baseUrl(HttpUrl.get(baseUrl));//转换}我们可以看到他会跳转到baseUrl(HttpUrl baseUrl)方法↓ public Builder baseUrl(HttpUrl baseUrl) {Objects.requireNonNull(baseUrl, baseUrl null);ListString pathSegments baseUrl.pathSegments();//分割成几个路径碎片//检查是否以/结尾否则抛出异常if (!.equals(pathSegments.get(pathSegments.size() - 1))) {throw new IllegalArgumentException(baseUrl must end in /: baseUrl);}this.baseUrl baseUrl;return this;}addConverterFactory() //存储 Converter.Factoryprivate final ListConverter.Factory converterFactories new ArrayList();public Builder addConverterFactory(Converter.Factory factory) {converterFactories.add(Objects.requireNonNull(factory, factory null));return this;}这里用来把转换工厂放入Retrofit的集合中我们一般在括号内填的是第三方库GsonConverterFactory.create()
public final class GsonConverterFactory extends Converter.Factory {public static GsonConverterFactory create() {// 调用create()↓return create(new Gson()); -步骤2}public static GsonConverterFactory create(Gson gson) {return new GsonConverterFactory(gson); // 创建了一个含有Gson对象实例的GsonConverterFactory ↓}private final Gson gson;private GsonConverterFactory(Gson gson) {if (gson null) throw new NullPointerException(gson null);this.gson gson;} Retrofit默认使用Gson进行解析 client() public Builder client(OkHttpClient client) {return callFactory(Objects.requireNonNull(client, client null));}/*** Specify a custom call factory for creating {link Call} instances.** pNote: Calling {link #client} automatically sets this value.*/public Builder callFactory(okhttp3.Call.Factory factory) {this.callFactory Objects.requireNonNull(factory, factory null);return this;}//当创建 Retrofit 实例时会使用这个 callFactory 对象来创建 Call 对象用于执行网络请求。