Volley 简要分析

  这里只是一个队 Volley 做一个简要的分析,权当是自己的一个记录,详情异步至 Volley 源码分析


一、总的流程

1、add 增加一个 Request 到 RequestQueue 中
RequestQueue 中的一个主要成员变量:
存放所有的请求: Set<Request<?>> mCurrentRequests = new HashSet<Request<?>>();

网络请求队列:PriorityBlockingQueue<Request<?>> mNetworkQueue;

缓存队列:PrioriytBlockingQueue<Request<?>> mCacheQueue;

网络处理:mNetworkDispathcher 
判断当前返回结果是否需要更新,是否需要再次请求网络;

缓存处理:mCacheDispatcher
判断当前是否有缓存,缓存信息是否可用,不可用时就去请求网络。

2、开始队列 


二、主要的类

1、Request 抽象类,用于网络请求

子类需要实现的方法:

deliverResponse(T response)  分发结果;

parsetNetworkResponse(NetwokResponse response)  将网络请求回来的数据,转化成请求的数据格式;

直接子类:

ImageRequest, JsonArrayRequest, JsonObjectRequest, JsonRequest, StringRequest;


2、Network 接口, 请求网络数据

BasicNetwork 是实现该接口方法类, performRequest();


3、HttpStack, 接口,HTTP 请求

方法: performRequest();

实现类:

HurlStack() 基于 HttpURLConnection , SDK >= 9 版本以上;

HttpClientStack() 基于 HttpClient, SDK < 9 版本以下;


4、CacheDispatcher , 一个线程, extends Thread;


5、NetworkDispatcher,  一个线程, extends Thread;

启动四个默认 NetworkDispatcher 线程用于网络请求数据。


6、ResponseDelivery, 接口, 用于分发结果

实现类为 ExecutorDelivery


7、RequestQueue

主要成员:

PriorityBlockingQueue<Request<?>>  mCacheQueue 缓存的阻塞队列

PriorityBlockingQueue<Request<?>> mNetworkQueue 网络的阻塞队列


start() 方法,核心的开始

/**
     * Starts the dispatchers in this queue.
     * 核心的开始
     */
    public void start() {
        stop();  // Make sure any currently running dispatchers are stopped.
        // Create the cache dispatcher and start it.
        mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);
        mCacheDispatcher.start();  // 会调用 CacheDispatcher.run() 方法

        // Create network dispatchers (and corresponding threads) up to the pool size.
        for (int i = 0; i < mDispatchers.length; i++) {    // 默认为四个
            NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork, mCache, mDelivery);
            mDispatchers[i] = networkDispatcher;
            networkDispatcher.start();  // 会调用 NetworkDispatcher.run() 方法
        }
    }
 

三、网络请求过程

Volley 简要分析_第1张图片

四、分发结果的过程

1、在 RequestQueue 构建时,生成一个 ExecutorDelivery, 并且传入一个主线程的 Handler;

2、缓存请求和网络请求都是在新开辟的线程中,得到结果后,调用 ResponseDelivery.postResponse 方法

3、在ExecutorDelivery.postResponse 方法中,调用了 Handler, post 回主线程;

五、HttpClient 和 HttpURLConnection 的异同

同点:
都支持 Https 协议,以流的形式进行上传和下载。可以配置超时时间,IPV6, 以及连接池等功能;

不同:
HttpClient :
 在 Android 2.2 以前使用, 在 6.0 之后已经废弃;

HttpURLConnection: 
是种多用途,轻量级 Http 客户端,适用于大多数应用程序;
在 Android 2.2 之前有一些 bug. 在 2.3 之后修复,并且在 2.3 加入了响应压缩;在4.0 增加了响 应缓存机制,通过反射方式启动响应缓存功能;

选择:
在 Android 2.2 之前,使用 HttpClient;
在 Android 2.3 及其之后, 使用 HttpURLConnection.




你可能感兴趣的:(Android开发,Volley,android-网络)