Android.Volley的解读:初始接触volley

public RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext());

一切都从这句代码开始。。。

跟着newRequestQueue(Context)到Volley类中

public class Volley {
     ...
     public static RequestQueue newRequestQueue(Context context) {
        return newRequestQueue(context, null);
    }
}
 1 public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
 2         File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
 3
 4         String userAgent = "volley/0";
 5         try {
 6             String packageName = context.getPackageName();
 7             PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
 8             userAgent = packageName + "/" + info.versionCode;
 9         } catch (NameNotFoundException e) {
10         }
11
12         if (stack == null) {//你开始传null,所以走这里
13             if (Build.VERSION.SDK_INT >= 9) {
14                 stack = new HurlStack();//SDK如果大于等于9,也就是Android 2.3以后,因为引进了HttpUrlConnection 
15             } else {//如果小于9,则是用HttpClient来实现
16                 // Prior to Gingerbread, HttpUrlConnection was unreliable.
17                 // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
18                 stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
19             }
20         }
21
22         Network network = new BasicNetwork(stack);
23       //创建一个Network,参数stack是用来网络通信
24         RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
25         queue.start();
26
27         return queue;
28     }

接下来就是RequestQueue了,F2跟进去

public RequestQueue(Cache cache, Network network) {
        this(cache, network, DEFAULT_NETWORK_THREAD_POOL_SIZE);
    }

 ...

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

 ...

public RequestQueue(Cache cache, Network network, int threadPoolSize,
            ResponseDelivery delivery) {
        mCache = cache;  //private final Cache mCache用于缓存
        mNetwork = network;  //private final Network mNetwork用于连接网络
        mDispatchers = new NetworkDispatcher[threadPoolSize];  /NetworkDispatcher继承thread,网络派发线程池
        mDelivery = delivery;  // 传递Response的实现
    }

以上四个参数中,前两个是传入参数,后两个参数,threadPoolSize线程池数,默认为4,剩下最后一个,进入ExecutorDelivery(new Handler(Looper.getMainLooper()))

public ExecutorDelivery(final Handler handler) {
        // Make an Executor that just wraps the handler.
        mResponsePoster = new Executor() {
            @Override
            public void execute(Runnable command) {
                handler.post(command);
            }
        };
    }

可以看到Handler将Response传回主线程,进行更新。

自此,代码RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network),已经执行完,下一句就是queue.start()了

看看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();

        // 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();
        }
    }

    /**
     * Stops the cache and network dispatchers.
     */
    public void stop() {
        if (mCacheDispatcher != null) {
            mCacheDispatcher.quit();
        }
        for (int i = 0; i < mDispatchers.length; i++) {
            if (mDispatchers[i] != null) {
                mDispatchers[i].quit();
            }
        }
    }

其中可以看到,start函数先调用stop退出mCacheDispatcher和mDispatchers的所有工作线程,确保当前正在运行的派发线程都停止以后,再重新创建并启动派发线程。

mDispatchers很好理解,就是RequestQueue初始化的网络派发线程池,那mCacheDispatcher是什么呢,字面意思就是缓存调度者(派发器)

看他构造函数中的四个参数,后两个mCache和mDelivery就是从第一句代码传进来的参数,比较好理解,剩下前面两个参数:mCacheQueue和mNetworkQueue

在RequestQueue.java中可以找到它两的定义,如下:

    /** The cache triage queue. */
    private final PriorityBlockingQueue<Request<?>> mCacheQueue =
        new PriorityBlockingQueue<Request<?>>();

    /** The queue of requests that are actually going out to the network. */
    private final PriorityBlockingQueue<Request<?>> mNetworkQueue =
        new PriorityBlockingQueue<Request<?>>();

PriorityBlockingQueue是java并发包java.util.concurrent提供的,使用PriorityBlockingQueue可以进行任务按优先级同步执行。看看泛型定义成Request可以联想到这两个队列应该是用来存储缓存请求和网络请求的。

自此volley的第一句代码已经执行完毕,返回一个RequestQueue了,我来自己总结一下第一句代码做了些什么:

1.第一步是从传入参数context定义好缓存目录cacheDir,包名版本号userAgent,HttpStack协议栈;利用协议栈创建network网络接口;利用缓存目录创建硬盘缓存cache

2.把network和cache传入RequestQueue创建请求队列,其中经过2步构造函数的重载跳转,新增加了网络派发线程池mDispatchers和应答传递者mDelivery,四个参数实现完成了RequestQueue的初始化工作。

3.requestqueue初始化完成后,调用start启动请求队列正式工作。其中start先是把requestqueue中的所有mCacheDispatcher和mDispatchers的工作线程退出,并重新加载。两者的创建都需要用到了RequestQueue内部私有成员PriorityBlockingQueue<Request<?>> mCacheQueue 和 PriorityBlockingQueue<Request<?>> mNetworkQueue。

自于mCacheQueue和mNetworkQueue实际的工作原理,就得分开记录了~

时间: 2024-08-05 03:53:24

Android.Volley的解读:初始接触volley的相关文章

Android应用开发:网络工具——Volley(一)

引言 网络一直是我个人的盲点,前一阵子抽出时间学习了一下Volley网络工具的使用方法,也透过源码进行了进一步的学习,有一些心得想分享出来.在Android开发中,成熟的网络工具不少,Android自带了HttpClient,还有okhttp,还有koush大神创建的ion开源项目,然后就是google后来加入到Android项目源码中的Volley.为什么使用Volley,是因为Volley使用简单,逻辑清晰,即使在调试过程中出现了问题,也可以快速的通过源码进行定位. Volley编译 因为已

快速Android开发系列网络篇之Volley

Volley是Google推出的一个网络请求库,已经被放到了Android源码中,地址在这里,先看使用方法 RequestQueue mRequestQueue = Volley.newRequestQueue(context); JsonObjectRequest req = new JsonObjectRequest(URL, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONO

Android应用开发:网络工具——Volley(二)

引言 在Android应用开发:网络工具--Volley(一)中结合Cloudant服务介绍了Volley的一般使用方法.当中包括了两种请求类型StringRequest和JsonObjectRequest.一般的请求任务相信都能够通过他们完毕了,只是在千变万化的网络编程中,我们还是希望能够对请求类型.过程等步骤进行全然的把控.本文就从Volley源代码角度来分析一下.一个网络请求在Volley中是怎样运作的.也能够看作网络请求在Volley中的生命周期. 源头RequestQueue 在使用V

[转]Android How to Download and Make Volley.jar

原文来自:http://tips.androidhive.info/2015/08/android-how-to-download-and-make-volley-jar/ 1 Comment . By Ravi Tamada . on August 31, 2015 If you are using Android Studio, adding volley support can done just by adding ‘compile com.mcxiaoke.volley:library

Android应用中网络请求库Volley的使用

接上文,这次来说一下如何使用Volley,会给出一些范例,和原理 Volley使用 StringRequest // 初始化一个请求队列,RequestQueue是volley库的类 RequestQueue queue = Volley.newRequestQueue(this); String url ="http://www.baidu.com"; //定义一个字符串型请求队列,需要传递4个参数分别是:url, 请求的方式(get, post..),响应成功的处理函数匿名对象,

Android网络编程(三)Volley用法全解析

相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection 前言 Volley想必很多人都用过,为了建立网络编程的知识体系,Volley是必须要讲的知识点,所以我这里有必要再次介绍一下Volley的使用. 1.Volley简介 在2013年Google I/O大会上推出了一个新的网络通信框架Volley.Volley既可以访问网络取得数据,也可以加载图片,并且在性能方面也进行了大幅度的调整,它的设计目标就是非常适合

Android的Service的初接触

刚刚看了一点与Service相关的书籍,做做笔记,希望也能帮到有需要的人. 首先,开发Service和Activity差不多,也是需要两个步骤: 一.定义一个继承Service的子类 二.在AndroidManifest.xml文件中配置该Service Service的生命周期方法如下: 1.abstract IBinder onBind(Intent intent):该方法是Service子类必须实现的方法.该方法返回一个IBinder对象,应用程序可以通过该对象与Service组件通讯 2

Android.Volley的解读:request

这文章是用来记录自己最近使用volley的StringRequest的一些心得,以及volley关于request的代码深读. 从网络上可以知道,volley适合数据量不大但是通信频繁的场景.volley提供的便利功能有如下这些: JSON,图像等的异步下载: 网络请求的排序(scheduling) 网络请求的优先级处理 缓存 多级别取消请求 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 从一些网络前辈和自己使用的情况来说,volley的图片处理并不是最佳,我

Android应用中网络请求库Volley的介绍

Volley 是一个HTTP的库,使用它能让Android应用网络传输的操作更加轻松,快捷.Volley的代码是托管在Android 源代码树下的一个工程,编译出来后是一个volley.jar文件.以下是Volley的特点 自动调度在代码中提交的网络请求(http) 多个网络请求的并发执行 对用户透明的磁盘或内存的缓存机制(本质是Http缓存机制) 能够支持网络请求的优先级 能在代码中,必要时轻松的取消网络请求(如activity销毁时),可以取消指定tag的网络请求,或按某种机制分类的网络请求