zoukankan      html  css  js  c++  java
  • ym—— Android网络框架Volley(终极篇)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103)。谢谢支持!

     

         没看使用过Volley的同学能够,先看看 Android网络框架Volley(体验篇)Android网络框架Volley(实战篇)在进行本篇学习这样会更好的理解本篇内容.

    本篇内容主要是讲Volley在某些细节方面的选择和实现.值得我们学习的地方以及假设更好的使用Volley。


    1.Volley本地缓存为什么有时候不会进行缓存?

    缓存使用前提server必须支持。缓存,配置Cache-Control头信息,

    由于Volley须要从这些头信息推断缓存是否已经过期。假设已经过期Volley将会又一次从网络获取数据。

    本人用抓包工具抓了无法缓存的返回头信息

    能够支持缓存的头信息


    2.假设我们自己写一个网络请求框架。我们内部实现会选择使用HttpURLConnection还是HttpClient?

    我们通过源代码来看看Volley是怎样选择使用的

      

    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 {
                stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
            }
        }
        Network network = new BasicNetwork(stack);
        RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
        queue.start();
        return queue;
    }
    这里会推断假设手机系统版本是大于9(Android 2.3)的。则创建一个HurlStack的实例,否则就创建一个HttpClientStack的实例。实际上HurlStack的内部就是使用HttpURLConnection进行网络通讯的,而HttpClientStack的内部则是使用HttpClient进行网络通讯的,这里为什么这样选择呢?參考文章:Android訪问网络。使用HttpURLConnection还是HttpClient?这就是它为何这么快的原因。


    从这点我们能够学习到。要针对不同SDK版本号做去对应更优的处理方式,这样才干达到最好的效果。


     3.Volley给我们提供了ImageRrequest,ImageLoader。NetworkImageView,它们分别使用于什么场景为什么?

    单张图片的载入能够通过发起 ImageReuqst 请求来实现。但为了应用内存缓存,推荐使用 ImageLoader 

    NetwoekImageView专门用于批量图片载入的场景:

    public class NetworkImageView extends ImageView {
        private String mUrl;
    
        // 默认显示的图片
        private int mDefaultImageId;
    
        // 载入失败时显示的图片
        private int mErrorImageId;
    
        // 主方法入口
        public void setImageUrl(String url, ImageLoader imageLoader) {
            mUrl = url;
            mImageLoader = imageLoader;
            // 这种方法将会对ImageView的尺寸是否有效、是否为同一张图片进行推断
            // 在运行新请求前,也会取消上一次在这个View里启动的还有一个已经失效的请求
            // 因为篇幅的限制以及代码行数太多,这里不贴出详细实现的代码
            loadImageIfNecessary(false);
        }
    
        // 假设图片已经滑离屏幕。变为不可见,将运行取消请求的操作
        @Override
        protected void onDetachedFromWindow() {
            if (mImageContainer != null) mImageContainer.cancelRequest();
            super.onDetachedFromWindow();
        }
    }
    在ListView载入多张图片的时候,NetworkImageView能够防止出现图片错误的现象,以及当NetworkImageView滑出屏幕的时候会取消载入图片请求。这样就保证载入多张图片的时候用户高速滑动列表的流畅性。给用户带来更优的体验。


  • 相关阅读:
    辅助方法
    扩展方法学习发展之路
    对IOC模式与容器Autofac在MVC里面的一些用法
    Qlikview Session Recovery
    SNOY VAIO 索尼电脑亮度自动变暗
    EXCEL2010数据挖掘插件 下载地址
    Ubuntu20.04 源码安装完应用 如何将应用程序添加到启动器
    flask + flask_restplus+ blueprints 脚手架
    闭包
    操作方法
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6962352.html
Copyright © 2011-2022 走看看