ym—— Android网络框架Volley(终极篇)

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

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


1.Volley本地缓存为何有时候不会进行缓存? 服务器

缓存使用前提服务器必须支持,缓存,配置Cache-Control头信息, 网络

由于Volley须要从这些头信息判断缓存是否已通过期。若是已通过期Volley将会从新从网络获取数据。 框架

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

能够支持缓存的头信息 工具


2.若是咱们本身写一个网络请求框架,咱们内部实现会选择使用HttpURLConnection仍是HttpClient? 学习

咱们经过源码来看看Volley是如何选择使用的 ui

  

[java]  view plain copy print ?
  1. public static RequestQueue newRequestQueue(Context context, HttpStack stack) {  
  2.     File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);  
  3.     String userAgent = "volley/0";  
  4.     try {  
  5.         String packageName = context.getPackageName();  
  6.         PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);  
  7.         userAgent = packageName + "/" + info.versionCode;  
  8.     } catch (NameNotFoundException e) {  
  9.     }  
  10.     if (stack == null) {  
  11.         if (Build.VERSION.SDK_INT >= 9) {  
  12.             stack = new HurlStack();  
  13.         } else {  
  14.             stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));  
  15.         }  
  16.     }  
  17.     Network network = new BasicNetwork(stack);  
  18.     RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);  
  19.     queue.start();  
  20.     return queue;  
  21. }  
这里会判断若是手机系统版本号是大于9(Android 2.3)的,则建立一个HurlStack的实例,不然就建立一个HttpClientStack的实例。实际上HurlStack的内部就是使用HttpURLConnection进行网络通信的,而HttpClientStack的内部则是使用HttpClient进行网络通信的,这里为何这样选择呢?参考文章:Android访问网络,使用HttpURLConnection仍是HttpClient?这就是它为什么这么快的缘由。

从这点咱们能够学习到,要针对不一样SDK版本作去相应更优的处理方式,这样才能达到最好的效果。 url


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

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

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

[java]  view plain copy print ?
  1. public class NetworkImageView extends ImageView {  
  2.     private String mUrl;  
  3.   
  4.     // 默认显示的图片  
  5.     private int mDefaultImageId;  
  6.   
  7.     // 加载失败时显示的图片  
  8.     private int mErrorImageId;  
  9.   
  10.     // 主方法入口  
  11.     public void setImageUrl(String url, ImageLoader imageLoader) {  
  12.         mUrl = url;  
  13.         mImageLoader = imageLoader;  
  14.         // 这个方法将会对ImageView的尺寸是否有效、是否为同一张图片进行判断  
  15.         // 在执行新请求前,也会取消上一次在这个View里启动的另外一个已经失效的请求  
  16.         // 因为篇幅的限制以及代码行数太多,这里不贴出具体实现的代码  
  17.         loadImageIfNecessary(false);  
  18.     }  
  19.   
  20.     // 若是图片已经滑离屏幕,变为不可见,将执行取消请求的操做  
  21.     @Override  
  22.     protected void onDetachedFromWindow() {  
  23.         if (mImageContainer != null) mImageContainer.cancelRequest();  
  24.         super.onDetachedFromWindow();  
  25.     }  
  26. }  
在ListView加载多张图片的时候,NetworkImageView能够防止出现图片错误的现象,以及当 NetworkImageView滑出屏幕的时候 会取消加载图片请求,这样就保证加载多张图片的时候用户快速滑动列表的流畅性。给用户带来更优的体验。
相关文章
相关标签/搜索