Volley源码之调用流程及各类作用

Volley作为2013年Google公司推出的一款面向android设备的网络开源框架,目前已被广泛的应用,优点是可扩展,缓存,dispatcher等。下面我们就简单根据调用的顺序,先聊聊到底Volley内部的运转流程是怎样的,用到了哪些设计模式,主要类有哪些有什么用以及有什么缺陷。

这一篇首先分析一下Volley内部的流转。

首先,我们在使用Volley时,要先调用

RequestQueue mQueue = Volley.newRequestQueue(this);

这一部是生成了一个RequestQueue,内部是怎么走的呢?首先会调用重载函数,最后重载到了如下代码:

 public static RequestQueue newRequestQueue(Context context, HttpStack stack, int maxDiskCacheBytes)

到这里面的方法会生成真正的requestQueue队列,这个方法内部主要做了以下几件事:

1)生成一个文件,这个文件是缓存文件,存放volley访问的数据进行缓存使用的:

 File cacheDir = new File(context.getCacheDir(), "volley");//名字默认是Volley

2)设置userAgent,这个userAgent在http请求头部存储,当HttpStack使用HttpClient时(SDK<9),会把这个userAgent信息用上。

try {
            String network = context.getPackageName();
            PackageInfo queue = context.getPackageManager().getPackageInfo(network, 0);
            userAgent = network + "/" + queue.versionCode;
        } catch (NameNotFoundException var7) {
            ;
        }

3)生成使用的HttpStack,这个HttpsTack其实就是最终操纵request去访问数据的类,如果在调用Volley.newRequest()时传入了这个那么就用传入的HttpStack,如果没传入那么再SDK>=9时会使用HurlStack,否则使用HttpClient(为什么这样做?)

if(stack == null) {
            if(VERSION.SDK_INT >= 9) {
                stack = new HurlStack();
            } else {
                stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
            }
        }

我们在生成RequestQueue时,只传入了context,所以httpStack就用的默认的。如果想自己写一个,可以实现HttpStack然后生成RequestQueue时传入这个自己写的HttpStack即可。

4)实例化NetWork对象,这也是非常关键的一个类,进行网络访问的,然后把上一步的HttpStack对象传入。

BasicNetwork network1 = new BasicNetwork((HttpStack)stack);

5)生成RequestQueue对象,如果构造RequestQueue时指定了最大缓存值,则指定最大缓存值,否则用默认的缓存值5MB

 RequestQueue queue1;
        if(maxDiskCacheBytes <= -1) {
            queue1 = new RequestQueue(new DiskBasedCache(cacheDir), network1);
        } else {
            queue1 = new RequestQueue(new DiskBasedCache(cacheDir, maxDiskCacheBytes), network1);
        }

6)调用queue.start()方法,然后将生成的requestQueue返回

 queue1.start();
 return queue1;

以上就是Volley.newRequest(Context context)的内部执行流程,Volley生成RequestQueue的对象对外暴露了四个方法,分别是:

 RequestQueue newRequestQueue(Context context)//不指定httpStack和缓存最大值用默认的

RequestQueue newRequestQueue(Context context, HttpStack stack)//指定HttpStack不指定缓存最大值

RequestQueue newRequestQueue(Context context, int maxDiskCacheBytes) //不指定HttpStack,指定缓存最大值

newRequestQueue(Context context, HttpStack stack, int maxDiskCacheBytes)//都指定

不论我们在构造RequestQueue时用了哪种方法,最后都会走向最后一种,并且再最后一种方法中做了6件事

1)生成缓存文件

2)指定UserAgent(SDK<9)

3)实例化HttpStack

4)实例化Network(BasicNetwok)

5)实例化RequestQueue

6)queue.start()并返回RequestQueue.

那么我们在使用请求时一般的写法是什么,这个内部又发生了什么?

HttpStack,Network,RequetQueue的作用分别是什么,queue.start()做了什么?这是后续要讲的

http://blog.csdn.net/szxgg/article/details/51346077

时间: 2024-08-09 00:32:58

Volley源码之调用流程及各类作用的相关文章

Volley源码(2):执行网络请求的流程

上一篇(http://blog.csdn.net/szxgg/article/details/51345859)讲述了当我们调用Volley.newRequest()时,Volley内部这个类做了什么,其实Volley这个类就做了一件事情,就是实例化了RequesQueue,这也符合设计模式中的单一职责,其实主要的处理都在其他类中,有三个类最重要,HttpStack/Network/RequestQueue,之后会讲解这些类的关系及作用,那首先还是结合我们使用Volley时的情形来看看源码内部执

[Android]Volley源码分析(二)Cache

Cache作为Volley最为核心的一部分,Volley花了重彩来实现它.本章我们顺着Volley的源码思路往下,来看下Volley对Cache的处理逻辑. 我们回想一下昨天的简单代码,我们的入口是从构造一个Request队列开始的,而我们并不直接调用new来构造,而是将控制权反转给Volley这个静态工厂来构造. com.android.volley.toolbox.Volley: public static RequestQueue newRequestQueue(Context conte

[Android] Volley源码分析(一)体系结构

Volley:google出的一个用于异步处理的框架.由于本身的易用性和良好的api,使得它能得以广泛的应用.我还是一如既往从源码的方向上来把控它.我们先通过一段简单的代码来了解Volley RequestQueue queue = Volley.newRequestQueue(this); ImageRequest imagerequest = new ImageRequest(url, new Response.Listener<Bitmap>(){ @Override public vo

Volley源码分析(2)----ImageLoader

一:imageLoader 先来看看如何使用imageloader: public void showImg(View view){ ImageView imageView = (ImageView)this.findViewById(R.id.image_view); RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext()); ImageLoader imageLoader = new ImageLoader(m

Android Volley源码分析

今天来顺手分析一下谷歌的volley http通信框架.首先从github上 下载volley的源码, 然后新建你自己的工程以后 选择import module 然后选择volley. 最后还需要更改1个 配置文件 就是我选中的那句话.记得要加.不然会报错.把volley作为一个module 在你的项目中引用的原因是,因为我们要分析源码,需要测试我们心中所想.所以这么做是最方便的. 就相当于eclipse里面的工程依赖. 有关于volley 如何使用的教程 我就不在这写了,请自行谷歌,我们直接看

Volley源码分析二

在前两天我发布的文章:Volley源码分析一 中我较为详细的分析了Volley,今天继续,这篇文章会讲一些上一篇没有提到的比较细节的点,以及对于Volley源码中一些可以优化的实现的一些思考 ByteArrayPool的分析 byte[] 的回收池,用于 byte[] 的回收再利用,减少了内存的分配和回收.主要通过一个元素长度从小到大排序的ArrayList作为 byte[] 的缓存,另有一个按使用时间先后排序的ArrayList属性用于缓存满时清理元素. public synchronized

[Android]Volley源码分析(四)

上篇中有提到NetworkDispatcher是通过mNetwork(Network类型)来进行网络访问的,现在来看一下关于Network是如何进行网络访问的. Network部分的类图: Network有一个实现类BasicNetwork,它有一个mHttpStack的属性,实际的网络请求是由这个mHttpStack来进行的,看BasicNetwork的performRequest()方法, 1 @Override 2 public NetworkResponse performRequest

Volley 源码解析(转)

项目:Volley,分析者:grumoon,校对者:Trinea 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo分析者:grumoon,校对者:huxian99.Trinea,校对状态:完成 1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架.在 Google I/O 2013 大会上发布. 名字由来:a burs

Volley源码分析

Volley源码分析 Volley简介 volley官方地址 在Google I/0 2013中发布了Volley.Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮. 这是Volley名称的由来:a burst or emission of many things or a large amount at once.Volley特别适合数据量不大但是通信频繁的场景. Github上面已经有大神做了镜像,使用Gradle更方便.Volley On Github Vo