Volley学习(Volly分析)

记录下学习心得:

Volley是android平台上的网络通讯库,能使网络通信更快,更简单,更便捷。Volly适合数据量不大但是通信频繁的场景。

先贴下Volley的架构图:

Volley框架设计的主要几个类是Request(以及Volley提供的子类ImageRequest,StringRequest,JsonReques等),Volly,RequestQueue,CacheDispatcher,DiskBasedCache,NetworkDispatcher,BasicNetWork,HurlStack(HttpClientStack),ByteArrayPool,NetworkResponse,ExcutorDeliery(按照从新建一个Request请求到请求得到处理的顺序写的)。

下面的分析也是按照请求从创建到得到处理的顺序来完成的。

在Volley框架中,Request的管理是由RequestQueue来控制的。当我创建一个新的Request请求时,先创建一个RequestQueue对象,

RequestQueue= Volley.newRequestQueue(context);

看下newRequestQueue里面做了什么。

  public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
        File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);

        String userAgent = "volley/0";
        try {
            String packageName = context.getPackageName();
            PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
            userAgent = packageName + "/" + info.versionCode;
        } catch (NameNotFoundException e) {
        }

        if (stack == null) {
            if (Build.VERSION.SDK_INT >= 9) {
                stack = new HurlStack();
            } else {
                // Prior to Gingerbread, HttpUrlConnection was unreliable.
                // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
                stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
            }
        }

        Network network = new BasicNetwork(stack);

        RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
        queue.start();

        return queue;
    }

   首先在android 默认的缓存文件中创建一个缓存目录,在这里为什么选择系统默认的缓存文件夹,是因为放在系统默认的文件夹下,当apk删除时,文件夹下的缓存也相应被删除。

设置userAgent后,开始创建HttpStack,Volley根据系统版本来创建不同Stack,如果SDk的版本小于9的话,选择HtpClientSack,否则选择HurlStack,Volley这样做的原因是

在 Froyo(2.2) 之前,HttpURLConnection 有个重大 Bug,调用 close() 函数会影响连接池,导致连接复用失效,所以在 Froyo 之前使用 HttpURLConnection 需要关闭 keepAlive。

另外在 Gingerbread(2.3) HttpURLConnection 默认开启了 gzip 压缩,提高了 HTTPS 的性能,Ice Cream Sandwich(4.0) HttpURLConnection 支持了请求结果缓存。

      再加上 HttpURLConnection 本身 API 相对简单,所以对 Android 来说,在 2.3 之后建议使用 HttpURLConnection,之前建议使用 AndroidHttpClient。

创建玩HttpStack后,开始创建请求队列,RequestQueue里的参数有两个,一个是缓存处理类(DiskBasedCache),一个是网络请求处理类(BasicNetwork),初始化完毕后,调用queue.start()方法,启动线         程(这部分在RequestQueue中再分析)等待Request的到来。

时间: 2024-10-09 05:17:04

Volley学习(Volly分析)的相关文章

Volley学习(RequestQueue分析)

Volley的RequestQueue用来缓存请求处理器CacheDispatch和网络请求处理器NetworkDispatch来处理Request的.当我们调用RequestQueue.start()是,两个处理器开始运行起来,等待Request的到来. public void start() { stop(); // Make sure any currently running dispatchers are stopped. // Create the cache dispatcher

volley学习笔记

前言 这个是第一次写源码分析的文章(仅仅是给自己做个也给自己两天对volley学习的一个交代吧).以前的老大经常强调一种代码阅读能力(如何通过源码的阅读了解框架.流程.及使用注意细节呢)网上查找了很多相关资料,如何培养源码阅读能力,但也是零零闪闪不全面.这可能与源码阅读设计到多方面,经验+知识面宽度等等.(这里不总结,个人修道还不深,求大神带飞),但是个人觉得思路还是一样的,源码阅读也罢新技术学习也罢.重点在于 核心概念+流程+关键点这里写上个人理解. 核心概念:每一个框架都有自己的核心概念(如

[Android]Volley源码分析(四)

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

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

[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源码分析(叁)Network

如果各位看官仔细看过我之前的文章,实际上Network这块的只是点小功能的补充.我们来看下NetworkDispatcher的核心处理逻辑: <span style="font-size:18px;">while (true) { try { // Take a request from the queue. request = mQueue.take(); } catch (InterruptedException e) { // We may have been int

[Android]Volley源码分析(肆)应用

通过前面的讲述,相信你已经对Volley的原理有了一定了解.本章将举一些我们能在应用中直接用到的例子,第一个例子是 NetworkImageView类,其实NetworkImageView顾名思义就是将异步的操作封装在了控件本身,这种设计可以充分保留控件的移植性和维护性.NetworkImageView通过调用setImageUrl来指定具体的url: public void setImageUrl(String url, ImageLoader imageLoader) { mUrl = ur

Volley学习(网摘)

Android网络通讯架构--Volley 1. Volley提供的功能简单来说,它提供了如下的便利功能: JSON,图像等的异步下载: 网络请求的排序(scheduling) 网络请求的优先级处理 缓存 多级别取消请求 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2.学习前的准备:下载volley源码打成jar包(我通过这个网址下载不下了,但是网络上很多好心人已经分享了源码) 下载地址: mirror of volley library from andr

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

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