volley框架的解读

本文详细介绍了Volley框架的工作流程,包括主线程、缓冲线程和网络线程的角色,以及如何通过RequestQueue添加请求到缓冲队列和网络队列。讨论了缓存策略和网络请求的实现,并提到了Android 6.0后HTTP客户端的变化。
摘要由CSDN通过智能技术生成

由于即将在项目中用到volley框架作为网络通信框架,所以把volley仔细看了一下。首先宏观角度讲下volley框架的大致结构 见下图:

Created with Raphaël 2.1.0 主线程 缓冲线程 主线程 网络线程 yes no

主线程:产生一个请求对象并加入请求队列中
缓冲线程:从请求队列中取出请求对象并经过一系列判断来确定是直接使用本定缓冲响应数据还是进行网络请求。(yes)说明本地缓存数据可用,直接传递给主线程更新view等界面操作,(no)说明本地缓存不可用或无缓存数据则进行网络数据请求
网络线程:直接进行网络数据的请求,并将响应数据进行缓存和传递主线程更新

下面直接从代码方面讲解volley,volley框架代码本不是很多,写的也比较好懂 ,主要有以下源文件
com/android/volley/toolbox/Volley.java
com/android/volley/RequestQueue.java
com/android/volley/CacheDispatcher.java
com/android/volley/NetworkDispatcher.java
com/android/volley/ExecutorDelivery.java
com/android/volley/Response.java
com/android/volley/toolbox/DiskBasedCache.java

Volley类提供了好几个实例化RequestQueue对象的重载方法,但最终都会调到以下的方法,只是初始化的参数不同而已

    public static RequestQueue newRequestQueue(Context context, HttpStack stack, int maxDiskCacheBytes) {
        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;
        if (maxDiskCacheBytes <= -1)
        {
            // No maximum size specified
            queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
        }
        else
        {
            // Disk cache size specified
            queue = new RequestQueue(new DiskBasedCache(cacheDir, maxDiskCacheBytes), network);
        }

        queue.start();

        return queue;
    }

此方法中会去实例化一个请求队列对象并传入一个本地缓存对象和一个网络对象。

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

    /**
     * Creates the worker pool. Processing will not begin until {@link #start()} is called.
     *
     * @param cache A Cache to use for persisting responses to disk
     * @param
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值