转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103)。谢谢支持!java
没看使用过Volley的同窗可以,先看看 Android网络框架Volley(体验篇)和Android网络框架Volley(实战篇)在进行本篇学习这样会更好的理解本篇内容.缓存
本篇内容主要是讲Volley在某些细节方面的选择和实现.值得咱们学习的地方以及假设更好的使用Volley。网络
1.Volley本地缓存为何有时候不会进行缓存?框架
缓存使用前提server必须支持。缓存,配置Cache-Control头信息,ide
因为Volley需要从这些头信息推断缓存是否已通过期。假设已通过期Volley将会又一次从网络获取数据。工具
本人用抓包工具抓了没法缓存的返回头信息post
可以支持缓存的头信息学习
2.假设咱们本身写一个网络请求框架。咱们内部实现会选择使用HttpURLConnection仍是HttpClient?ui
咱们经过源代码来看看Volley是怎样选择使用的url
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滑出屏幕的时候会取消载入图片请求。这样就保证载入多张图片的时候用户高速滑动列表的流畅性。给用户带来更优的体验。