android中volley框架源码解析

上次只是分享了volley框架的简单使用,现在是对volley源码的分析,下面是个人对volley框架的理解,让我一点点介绍。

下面这张图是volley总体的框架图,总共分成了五块,最主要的是处理请求的中央枢纽(requestQueue),当然其中还包括其他的一些,例如起新线程处理等,具体可以看下面的图。网络接口是主要用来发起网络请求的,network是一个接口,BasicNetwork是一个实现该接口的类,在处理请求的中央枢纽主要是通过该类来访问网络。存储Cache是将请求的结果存储在硬盘,是否存储是需要根据用户来定的,其中有字段来记录。请求Request是所有请求的父类,volley中总共提供了以下三种请求类型,当然用户也可以自定义request,只要继承Request父类即可,然后将request加入到requestQueue中即可,之后的事就不用担心了,这里JsonRequest还有两个子类,分别是JsonArrayRequest和JsonObjectRequest。volley的特色是加载图片,具体用法可以自行百度,这一块中主要的类是ImageLoader、ImageCache(这是一个接口),NetworkImageView是volley提供的自定义view,只要在xml文件中使用该view代替ImageView即可,因为该NetworkImageView也是继承ImageView。

这里是访问网络的具体的类,上面已经说明每个类的意义以及属性和操作。

android中volley框架源码解析_第1张图片

下面主要是处理请求的中央枢纽,有具体说明。

android中volley框架源码解析_第2张图片

该图是关于存储Cache的

该类是针对volley的特色来讲,最重要的是Imageloader,这个类相当于处理所有图片加载的中央枢纽,但是这个中央枢纽还是需要RequestQueue来辅助,因为总要访问网络的嘛。

android中volley框架源码解析_第3张图片

如果有问题可以留言,有错误请提出哦!


在上面讲RequestQueue的图中,类中属性mDispatcher是默认大小为4的一个数组,数组中的每个元素都是一个NetworkDispatcher,关联的networkQueue都是同一个,都是从该networkQueue中读取request然后执行,那么为什么不能像cacheDispatcher只声明一个变量就好了。这里源代码的作者是想多个线程同时进行,加速网络访问的速度,比如在一开始我们立马加入4个Request到RequestQueue中,假设每个request访问的平均时间为100ms,如果只有一个networkDispatcher的话,那么就是需要4*100ms=400ms。如果有4个networkDispatcher的话,四个并行执行,只用100ms就可以结束访问并得到数据。

下面是源代码:

    private NetworkDispatcher[] mDispatchers;

    public RequestQueue(Cache cache, Network network, int threadPoolSize,ResponseDelivery delivery) {
        mCache = cache;
        mNetwork = network;
        mDispatchers = new NetworkDispatcher[threadPoolSize];
        mDelivery = delivery;
    }

    public RequestQueue(Cache cache, Network network, int threadPoolSize) {
        this(cache, network, threadPoolSize,
                new ExecutorDelivery(new Handler(Looper.getMainLooper())));
    }

    public RequestQueue(Cache cache, Network network) {
        this(cache, network, DEFAULT_NETWORK_THREAD_POOL_SIZE);
    }
所以如果没有具体指定大小的话,就是4个,这应该是源代码作者在考虑了访问性能和资源消耗之后才选择的值。

你可能感兴趣的:(Volley)