终于把 OkHttp 和 Retrofit 的细节原理搞定了,接下来我们站的高一点,来宏观地看一下可以从 OkHttp 和 Retrofit 中学到什么。
如果让我们自己实现一个网络框架,可以这么设计分层:
Retrofit 就相当于上图中的用户层和请求处理、响应层,它们的执行层都是 OkHttp 。
分层最重要的就是“职责分离”,哪些是可以重用的、底层的,要拆分清楚,哪些是和业务、界面相关的,要单独放到上层,类似这样的,不同的功能分到不同的层次,然后给上下层提供接口。
OkHttp 的优点之一就是可以方便配置,我们在创建 OkHttpClient 时可以添加拦截器、自定义调度器、自定义鉴权器、缓存、Dns 等:
private OkHttpClient getOkHttpClient() {
return new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(final Chain chain) throws IOException {
return null;
}
})
.dispatcher(new Dispatcher())
.authenticator(new Authenticator() {
@Nullable
@Override
public Request authenticate(final Route route, final Response response) throws IOException {
return null;
}
})
// .cache(new Cache() {
//
// })
.dns(new Dns() {
@Override
public List<InetAddress> lookup(final String hostname) throws UnknownHostException {
return null;
}
})
.build();
}
除了 Builder 构建者模式外,主要 归功于 OkHttp 使用的门面模式和依赖抽象 。
OkHttp 的门面类 OkHttpClient 中都是以接口的形式引用了那些网络请求的核心,既允许用户自己自定义实现,也提供了默认实现,因此十分灵活。
我们在开发时,也最好先确定功能、定义接口,然后在向外部暴露的门面类中,允许用户配置。
对于依赖很多资源或者创建耗时的对象,我们最好像 OkHttp 的连接池一样,将对象放到池里重复利用。
android.support.v4 包里为我们提供了创建对象池的模板:
public final class Pools {
public static interface Pool<T> {
//从池里获取一个对象
public T acquire();
//释放一个对象到池里
public boolean release(T instance);
}
}
其中还提供了两个简单实现:
SimplePool :非同步的对象池 SynchronizedPool :有同步处理的对象池 我们来简单看看 SimplePool :
```
{
private final Object[] mPool;
private int mPoolSize;
//参数是对象池的最多容量
public SimplePool(int maxPoolSize) {
if (maxPoolSize <= 0) {
throw new IllegalArgumentException("The max pool size must be > 0");
}
mPool = new Object[maxPoolSize];
}
@Override
@SuppressWarnings("unchecked")
public T acquire() {
if (mPoolSize > 0) {
final int lastPooledIndex = mPoolSize - 1;