zoukankan      html  css  js  c++  java
  • 谷歌Volley网络框架讲解——网络枢纽

    研究了这么久的Volley,愈来愈发现这个框架的精美和人性化。比起民间一些框架强很多,一开始总是盲人摸象找不到头绪,现在终于有些明朗了。Volley其实就是一个请求队列的代理类,我们看下UML。

    这就是Volley的网络请求中心枢纽,我们重头再梳理一下。

    首先通过Volley类建立一个请求队列RequestQueue,这个队列可以定制个线程池规定多少个线程跑,一个NetworkDispatche对象就是一个线程,而加入进队列的请求就根据工作调度机制由一个NetworkDispatche线程去执行。而NetworkDispatche的请求执行是通过Network的现实类BasicNetwork代劳,而底层原生的http请求就是通过HttpStack实现类就是上图的两个HttpClientStack和HurlStack执行。这两个类的区别在于HttpClientStack是直接用HttpClient的execute()方法执行一个Http请求,而HurlStack就是直接用URL.openConnection()进行连接,这种方式在2.3以上是不能用的,所以分开了这两种方式。

    我们看下这里有几个转换解析请求获取响应结果的地方:

    1.HttpStack接口的performRequest()方法

    public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)

    2.Network接口的performRequest()方法

    public NetworkResponse performRequest(Request<?> request)

    3.Request类的parseNetworkResponse()抽象方法

    abstract protected Response<T> parseNetworkResponse(NetworkResponse response);

    可以很鲜明得看出第一个是对原生Http请求的解析,解析出来是一个Apach的HttpResponse 实例,这个结果就是通过上述两个HttpStack的实现类HttpClientStack和HurlStack执行获取的获取的。而第二个解析出来是框架自定的NetworkResponse,这是通过Network的实现类BasicNetwork来获取的。第三个就是第二个得出来NetworkResponse解析成用户期望Response<T> 了,这个Response和Request是对应的,有String型,json型还有Image型的。然后在通过ResponseDelivery把解析好的结果发送到主线程。

    从Request到Response就是这样一步步走来的。

    我们再回过头看一眼Volley的概括吧

    public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
            File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);//缓存目录
    
            String userAgent = "volley/0";//UA
            try {
                String packageName = context.getPackageName();
                PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
                userAgent = packageName + "/" + info.versionCode;
            } catch (NameNotFoundException e) {//如果没获取到包信息那UA就还是volley/0
            }
    
            if (stack == null) {//如果调用的是默认的构造器
                if (Build.VERSION.SDK_INT >= 9) {//2.3以上sdk
                    stack = new HurlStack();
                } else {//2.3以下不能用HttpUrlConnection?
                    // 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);//通过HttpStack创建一个BasicNetwork#performRequest
    
            RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);//Cache,Network
            queue.start();
    
            return queue;
        }
  • 相关阅读:
    WinFrom 经典登录窗体(转)
    .Net 反射牛刀小试
    WCF和Entity framework 发现的性能问题(转)
    扩展方法(C# 编程指南)
    如何把Access中数据导入Mysql中 (转)
    MD5 Message Digest
    .Net 集合排序
    test
    如何使自己的程序只运行一次(转)
    WCF传较大数据(转)
  • 原文地址:https://www.cnblogs.com/bvin/p/3291611.html
Copyright © 2011-2022 走看看