终于把 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;