Android 类Volley网络请求框架结构简单剖析

序言

咱们可能已经使用过Volley,固然如今最多得回事OkHttp,Volley的实现也是以前至关大的一部分网络请求框架的大体实现方式。若是你已经饱读各种网络请求库的源代码,能够移步了,这里只是对于其大体面貌进行一个阐述,附带上一些代码的实现,具体的将会写好以后贴出来。缓存

正题

  • Request安全

  • Response网络

  • HttpStack框架

  • NetWorkExecutoride

  • ResponseDelivery函数

  • HttpStackFactoryoop

  • RequestQueue
    一个网络请求框架,大体须要本身写这些类,具体作什么呢?post

  1. 要有一个Request类,若是是要写框架,固然要将其声明为抽象类或接口,方便进一步扩展,其要实现的功能是对于底层的HttpUrlConnection或者HttpClient进行一个封装,好比对于头部和一些请求参数的设定,用户能够很方便的对其定制,而后将参数的设置细节进行一个隐藏,而后用户能够很方便的进行参数的传递,同时设置请求的回调,直接在UI线程处理结果,要借助ResponseDelivery来实现。url

  2. 维护一个请求队列,咱们的请求会有不少,这个时候,咱们须要维护一个线程安全的请求队列,而后根据请求的优先级,来进行相应的操做。线程

  3. 请求队列构建好了,那么接下来须要的就是有执行者来进行执行这些操做了,显然为了提高速度,咱们须要经过线程池,线程池中的线程用来出列这些请求,若是出列请求呢?显然,轮询请求队列便可,固然若是咱们设置了缓存,能够先根据请求的url在咱们的cache中进行一个查找,若是找不到的时候,能够再发起网络请求,获得轮询队列这种的请求,具体的任务就要交给负责网络请求的类去作了。这里咱们经过一个Http栈,就是对于HttpClient和HttpUrlConnection的一个封装,而后对咱们的请求进行一个解析,而后返回结果。

    public void run(){
            try {
                while(!isStop){
                    final Request<?> request = mRequestQueue.take();
                    if(request.isCanceled()){
                        continue;
                    }
                    Response response = null;
                    if(isUseCache(request)){
                        response = mReqCache.get(request.getUrl());
                    }else{
                        response = mHttpStack.preformRequest(request);
                        if(request.isShouldCache()&&isSuccess(response)){
                            mReqCache.put(request.getUrl(),response);
                        }
                    }
                    mResponseDelivery.deliveryResponse(request,response);
                }
            }catch (InterruptedException e){
    
            }
        }
    public interface HttpStack {
    
        public Response preformRequest(Request<?> request);
    }
  4. 返回的结果封装在一个Response中,咱们能够根据咱们的需求,对其作相应的解析。

  5. 结果传递,拿到了咱们的相应结果咱们如今处在线程池中,是没法对于咱们的UI线程进行相应的操做的,所以咱们须要将咱们的结果传递到主线程。经过咱们的本身实现ResponseDelivery,具体的实现就是获得告终果后,咱们注入咱们的请求类和咱们的响应结果依赖,该类会得到当前主线程的Handler,而后实现一个runnable,调用Request的监听器,通知将Response传递进去,而后让Handler,post出这个Runnable,优雅实现,线程切换。

public class ResponseDelivery implements Executor {

    Handler mResponseHandler = new Handler(Looper.getMainLooper());

    public void deliveryResponse(final Request<?> request,final Response response){
        Runnable respRunnable = new Runnable() {
            @Override
            public void run() {
                request.deliveryResponse(response);
            }
        };
        execute(respRunnable);
    }

    @Override
    public void execute(Runnable command) {
        mResponseHandler.post(command);
    }

Request类中用来传递的函数

public final void deliveryResponse(Response response){
        T result = parseResponse(response);
        if(mRequestListener!=null){
            int stCode = response!=null?response.getStatusCode():-1;
            String msg = response !=null?response.getMessage():"unkown error";
            mRequestListener.onComplete(stCode,result,msg);
        }
    }

感兴趣的话,开始动手撸吧。。

相关文章
相关标签/搜索