基于Retrofit,OkHttp,SqlLite的网络请求框架封装

378 阅读4分钟
原文链接: www.jianshu.com

从今天开始,我决定做一件有意义的事,逐步开源一些我认为很有价值的项目并附带一些深度的原理分析。给那些想要提高android开发技术水平,但又没有思路的同学一些方法上的启迪。同时也可以宏观上扩展个人的技术视野和眼界。下面开始第一个开源项目的深度讲解,大家一起来吧。

项目名称DDNetCore,封装这个框架的主要目的是简化网络数据的获取,解析过程,让业务开发者从处理网络数据获取的复杂事务中解脱出来,将更多的关注点放在业务逻辑的开发上面。

项目git地址:github.com/jessie345/D…

下面我尝试以一种更容易理解的方式说明这个框架的使用方式和工作原理。首先来一张框架流程图,可以从宏观的角度理解下框架内部交互的大体过程。


数据请求框架.png
数据请求框架.png

现在,我们按照流程图描述的执行顺序,逐步阐述框架的使用方式及原理。

发起数据请求的第一步需要实例化请求对象,并塞给RequestManager 执行。原生的方式需要为不同的请求创建不同的Request子类,子类中处理请求相关的逻辑(覆写相关的回掉方法)并实例化。但是这种方式带来一个问题,对于大多数请求,请求及响应结果的处理逻辑基本相同,为了减少创建子类的重复劳动,网络库提供了DataRequestBuilder 构建器,通过他,可以创建通用的对象请求(返回结果可以对等一个bean),列表请求实例(返回结果可以对比成List<Bean>)。这个模式极大的简化了发起请求需要执行的前期工作,让你编写数据接口的工作相当简单,我举个例子:

  Request request = DataRequestBuilder.asArrayRequest("/products")
                .requestId(REQUEST_FETCH_PRODUCTS)
                .requestDefaultStrategy(Constants.STRATEGY_LEVEL3_CACHE)
                .requestExpireStrategy(Constants.STRATEGY_REFRESH_CACHE)
                .memoryCache()
                .dbCache()
                .dataClass(ProductBean.class)
                .httpMethod(Constants.HTTP_METHOD_GET)
                .build();

上面几行代码创建了一个获取产品列表的数据请求,第一行代码指定了创建一个路径为/products的数组请求,即服务器返回的数据是个列表。第二行代码为请求指定了id,通过这个id,我在响应回调里可以非常容易的区分哪个请求的结果返回了。第三第四行代码分别指明了默认情况和请求响应结果过期情况的请求执行策略,框架提供三种数据请求策略,分别为:Constants.STRATEGY_LEVEL3_CACHE(三级缓存策略),Constants.STRATEGY_REFRESH_CACHE(强制刷新缓存策略),Constants.STRATEGY_ONLY_NET(强制请求网络策略)。第五行第六行指定请求是否使用内存和数据库缓存。第七行指定用哪个class反序列化服务器返回的数据。倒数第二行指定了请求的执行方式为get,框架同时内置了对两种基本请求方式的支持,Constants.HTTP_METHOD_GET(基本get请求方式),Constants.HTTP_METHOD_POST(post 请求方式,post的content-type可以为application/json,www-form-urlencoded)

有了request实例,我们可以将它交给RequestManager执行了。我在BaseActivity中封装了如下代码:

    public void enqueueRequest(Request request) {
        if (!mNetworkControl.isControlListenerRegistered(this)) {
            mNetworkControl.registerControlListener(this);
        }

        mNetworkControl.enqueueRequest(request);
    }

通过NetWorkControl实例,将请求交给RequestManager执行,NetWorkControl中会执行一些与取消请求相关的逻辑。

请求已经提交到线程池执行,那么我们如何接收返回的数据结果呢。NetworkControl 类提供了获取响应结果的监听函数:

    public void registerControlListener(@NonNull NetworkControlListener listener) {
        Preconditions.checkNotNull(listener);
        this.mListenerRef = new WeakReference(listener);
    }

注册监听后,通过如下三个与请求生命周期相关的回调,就可以获取请求及响应的相关信息啦。

    public void handlePreNetRequest(@NonNull Request request) {
    }

    @Override
    public void handleNetRequestError(@NonNull Request request, @NonNull ResponseHeader rb) {
    }

    @Override
    public void handleReceivedResponse(@NonNull EventResponse event) {
    }

handlePreNetRequest 表示某个请求即将添加到请求队列执行。handleNetRequestError 表示某个请求发生了错误。handleReceivedResponse 表示请求的结果正确返回。通过这三个方法就能判断Request的执行状态了。

体会一下,写一个请求接口是不是很简单。

如果想了解更多信息或者对开源项目感兴,请加我的微信公众号,我在那里等你

小熊的开源社区.jpg
小熊的开源社区.jpg