本文章是基于retrofit 2.4.0 分析,我们一起来分析学习一下。
- 首先,我们写一个基本网络请求
Retrofit mRetrofit = new Retrofit.Builder()
.baseUrl(URL).build();
接下来,我们一步步分析。
public Builder() {
this(Platform.get());
}
这里我们先看一下Platform.get()。最终调用了这里
private static Platform findPlatform() {
try {
Class.forName("android.os.Build");
if (Build.VERSION.SDK_INT != 0) {
return new Android();
}
} catch (ClassNotFoundException ignored) {
}
try {
Class.forName("java.util.Optional");
return new Java8();
} catch (ClassNotFoundException ignored) {
}
return new Platform();
}
不出意外android手机是带有os.build这个类的。这里生成了一个android class对象。
static class Android extends Platform {
@Override public Executor defaultCallbackExecutor() {
return new MainThreadExecutor();
}
@Override CallAdapter.Factory defaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
if (callbackExecutor == null) throw new AssertionError();
return new ExecutorCallAdapterFactory(callbackExecutor);
}
static class MainThreadExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override public void execute(Runnable r) {
handler.post(r);
}
}
}
然后Retrofit.Builder()基本就完成了。我们来看一下.baseUrl(URL)。
接着,我们看一下httpurl对象的生成过程。以此我们看到源码会调用:
public static @Nullable HttpUrl parse(String url) {
try {
return get(url);
} catch (IllegalArgumentException ignored) {
return null;
}
}
public static HttpUrl get(String url) {
return new Builder().parse(null, url).build();
}
public Builder() {
encodedPathSegments.add(""); // The default path is '/' which needs a trailing space.
}
然后调用parse方法,这里初始化了host,port,encodedUsername,encodedPassword等参数。(这里实在是比较繁琐,有兴趣的同学可以自己看一下)最终调用build方法,生成了一个httpurl对象。
然后我们回到这里
return baseUrl(httpUrl);
接下来,就是一些非空判断,结尾路径判断,然后赋值baseUrl。
然后我们回到.build方法。
首先一个非空判断,当我们没有使用.client方法时,callbackExecutor此时为null。这时这里会生成一个默认的OkhttpClient。
同理callbackExecutor也是生成一个默认的Executor。(此时由上面生成的是android 对象 这里是调用andorid 对象里的方法,最终这里生成了MainThreadExecutor 线程调度器)。
callAdapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));这里会把转换器加入工厂。
然后是生成解析器工厂。
最终调用,
return new Retrofit(callFactory, baseUrl, unmodifiableList(converterFactories),
unmodifiableList(callAdapterFactories), callbackExecutor, validateEagerly);
生成一个最简单的retrofit。