码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-12 23:53:40      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

  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












































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

标签:

原文地址:http://blog.csdn.net/szxgg/article/details/51345859

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!