转载

揭秘网络框架第六篇: OkHttp 和 Retrofit 中可以学到的架构思想

终于把 OkHttpRetrofit 的细节原理搞定了,接下来我们站的高一点,来宏观地看一下可以从 OkHttpRetrofit 中学到什么。

OkHttp 和 Retrofit 中可以学到的架构思想

分层架构

首先可以学到的就是经典的分层架构思想:

揭秘网络框架第六篇: OkHttp 和 Retrofit 中可以学到的架构思想

  • Okio 实现底层 IO,高效易用
  • 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 :

```

public static class SimplePool implements Pool

{

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;
原文  https://xiaozhuanlan.com/topic/5687031492
正文到此结束
Loading...