Volley源码分析-框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiayong1/article/details/79362045

Volley框架分析

最近在学习Volley框架,把自己的所得记录下来,一方面方便和大家沟通交流,另一方面也方便自己以后温习,如有不对的地方,请指正。后续会陆续更新介绍Volly重要类的源码。

Volley框架基本流程图
上图为Volley框架的基本流程图。

1、Volley框架的入口类为Volley类,在Volley类调用以下方法确定网络请求的方式(HttpUrlConnection\DefaultHttpClient)、缓存方法(DiskBasedCache)以及开启子线程处理请求队列(CacheDispatcher以及NetworkDispatcher)。

// 根据android的版本确定网络请求方式,确定缓存方法、以及开启子线程处理请求队列
public static RequestQueue newRequestQueue(Context context, BaseHttpStack stack) {
        BasicNetwork network;
        if (stack == null) {
            if (Build.VERSION.SDK_INT >= 9) {
                // SDK高于Android API Level 9(Android 2.2),使用HttpURLConnection做网络请求
                network = new BasicNetwork(new HurlStack());
            } else { // 使用DefaultHttpClient做网络请求
                String userAgent = "volley/0";
                try {
                    String packageName = context.getPackageName();
                    PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
                    userAgent = packageName + "/" + info.versionCode;
                } catch (NameNotFoundException e) {
                }

                network = new BasicNetwork(
                        new HttpClientStack(AndroidHttpClient.newInstance(userAgent)));
            }
        } else {
            network = new BasicNetwork(stack);
        }
        // 确定缓存方法、以及开启子线程处理请求队列
        return newRequestQueue(context, network);
    }
private static RequestQueue newRequestQueue(Context context, Network network) {
        File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
        // 创建请求队列,并确定缓存方法
        RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
        // 开启子线程处理网络请求
        queue.start();
        return queue;
    }

2、当要发起一个新的网络请求时,首先将网络请求放入RequestQueue队列,然后根据网络请求的类型(后面文章会详细介绍),CacheDispatcher或者NetworkDispatcher(CacheDispatcher和NetworkDispatcher本质上都是Thead)会将该请求从队列中拿出来进行处理,处理的过程中如果涉及需要发网络请求去服务器获取数据,那么会使用Volley类中创建的网络请求方式(HttpUrlConnection\DefaultHttpClient)来进行具体的网络请求工作。网络请求的结果最终由ExecutorDelivery进行分发。

猜你喜欢

转载自blog.csdn.net/xiayong1/article/details/79362045