Android Volley 详解 Google发布的一套用于网络通信的工具库



Volley 能作什么

Google 2013 I/O 大会上发布的一个网络通信库。处理一些网络方面的请求,如数据解析、下载显示图片。

· 数据处理:对网络请求获取的数据的处理。

· 图片加载:对网络图片的下载及显示。


使用步骤

使用权限

 <uses-permissionandroid:name="android.permission.INTERNET"/>

 <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


初始化请求队列

RequestQueue mRequestQueue =  Volley.newRequestQueue(Context context);


网络请求数据处理

默认提供两种数据请求类型,一为StringRequest,一为JsonRequest

JsonRequest又分:

· JsonArrayRequest

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. JsonArrayRequest request = new JsonArrayRequest("url",   
  2.                 new Response.Listener<JSONArray>() {  
  3.   
  4.                     @Override  
  5.                     public void onResponse(JSONArray response) {//请求响应返回的JSONArray  
  6.                           
  7.                     }  
  8.                 },   
  9.                 new Response.ErrorListener() {  
  10.   
  11.                     @Override  
  12.                     public void onErrorResponse(VolleyError error) {  
  13.                           
  14.                     }  
  15.                 });  
  16.         mRequestQueue.add(request);  

· JsonObjectRequest

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. JsonObjectRequest request = new JsonObjectRequest(Method.GET, WEATHER_JSON_ADDRESS, null,   
  2.                 new Response.Listener<JSONObject>() {  
  3.   
  4.                     @Override  
  5.                     public void onResponse(JSONObject response) {//请求响应返回的JSONObject  
  6.                         System.out.println(response);  
  7.                     }  
  8.                 },  
  9.                 new Response.ErrorListener() {  
  10.   
  11.                     @Override  
  12.                     public void onErrorResponse(VolleyError error) {  
  13.                         System.out.println("test4JsonObjectRequest - error");  
  14.                     }  
  15.                 });  
  16.           
  17.         mRequestQueue.add(request);  
    mRequestQueue.add(request);  将请求加入队列。 可以有很多个add 入队操作,然后start
    mRequestQueue.start();             启动请求
    mRequestQueue.stop();             停止请求


图片加载请求

· ImageRequest 加载图片

  使用方式与上面的JsonRequest类似

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private void requestByImageRequest(final ImageView imageView, String url) {  
  2.         ImageRequest imgRequest = new ImageRequest(url,   
  3.                 new Response.Listener<Bitmap>() {  
  4.                     @Override  
  5.                     public void onResponse(Bitmap bitmap) {//下载成功后  
  6.                         imageView.setImageBitmap(bitmap);  
  7.                     }  
  8.                 },   
  9.                 imageView.getWidth(), imageView.getHeight(), Config.RGB_565,   
  10.                 new ErrorListener(){  
  11.                     @Override  
  12.                     public void onErrorResponse(VolleyError error) { //下载出错  
  13.                           
  14.                     }  
  15.                 });  
  16.         mRequestQueue.add(imgRequest);  
  17.         mRequestQueue.start();  
  18.     }  

· ImageLoader 加载图片

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private void requestByImageLoader(ImageView imageView, String url) {  
  2.         int maxMemory = (int) Runtime.getRuntime().maxMemory();//app最大内存 字节数  
  3.         int mCacheSize = maxMemory / 8;  //以1/8 用作缓存  
  4.         final LruCache<String, Bitmap> mLruImageCache = new LruCache<String, Bitmap>(mCacheSize) {  
  5.             @Override  
  6.             protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size  
  7.                 if (android.os.Build.VERSION.SDK_INT >= 12) {  
  8.                     return value.getByteCount(); //需要api >=12 , 总字节数  
  9.                 } else {  
  10.                     return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行)   api1  
  11.                 }  
  12.             }  
  13.         };  
  14.         ImageCache imageCache = new ImageCache() {  
  15.             @Override  
  16.             public void putBitmap(String key, Bitmap value) {  
  17.                 mLruImageCache.put(key, value);  
  18.             }  
  19.   
  20.             @Override  
  21.             public Bitmap getBitmap(String key) {  
  22.                 return mLruImageCache.get(key);  
  23.             }  
  24.         };  
  25.         ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);  
  26.         // ImageLoader.getImageListener的第二个参数是默认的图片resource id,请求的图片为空时设置  
  27.         // 第三个参数是请求失败时候的资源id,可以指定为0  
  28.         ImageListener listener = ImageLoader.getImageListener(  
  29.                 imageView, android.R.drawable.ic_menu_rotate,  
  30.                 android.R.drawable.ic_delete);  
  31.         mImageLoader.get(url, listener); //get方法已经开始执行了加载url-bitmap  
  32.           
  33. //      ImageContainer imageContainer = mImageLoader.get(url, listener); //get方法已经开始执行了加载url-bitmap  
  34. //      Bitmap bitmap = imageContainer.getBitmap();  
  35. //      String requestUrl = imageContainer.getRequestUrl();  
  36.     }  

ImageLoader 需要结合 ImageCache来进行构造。ImageCache是一个interface

ImageCache 的put/get Bitmap的方法 ,推荐使用LruCache来实现。

ImageListener 是一个interface,提供两个方法:onResponse(),onResponseError()

ImageLoader 图片加载流程:ImageLoader.get(url, listener),判断是否存在于cache中,如果有,则直接取出并在listener中显示;如果没有,则new 一个ImageRequest,加入到requestQueue中,将listener中相应的方法在ImageRequest中的Response.Listener中进行调用。


· NetworkImageView 加载图片

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private void requestByNetworkImg(NetworkImageView imageView, String url) {  
  2.         final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(8*1024*1024) {  
  3.             @Override  
  4.             protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size  
  5.                 return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行)   api1  
  6.             }  
  7.         };  
  8.         ImageCache imageCache = new ImageCache() {  
  9.             @Override  
  10.             public void putBitmap(String key, Bitmap value) {  
  11.                 mImageCache.put(key, value);  
  12.             }  
  13.   
  14.             @Override  
  15.             public Bitmap getBitmap(String key) {  
  16.                 return mImageCache.get(key);  
  17.             }  
  18.         };  
  19.         ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);  
  20.         /* 
  21.          * seturl时,里面的实现是:有了ImageLoader,就能执行加载url-bitmap的操作 
  22.          */  
  23.         imageView.setDefaultImageResId(0); //默认图  
  24.         imageView.setErrorImageResId(0); //错误图  
  25.         imageView.setImageUrl(url, mImageLoader);   
  26.     }  

这是一个继承自ImageView的自定义组件。

imageView.setDefaultImageResId(0); //默认图
imageView.setErrorImageResId(0); //错误图
imageView.setImageUrl(url, mImageLoader); 

结合了ImageLoader,内部调用ImageLoader.get()来实现图片的加载。

在ListView中的item使用NetworkImageView:

    只需要new 一个ImageLoader对象。不同的item,set不同的URL即可。

    因为在ImageLoader中会new不同的ImageRequest加到RequestQueue中执行下载。


自定义Request

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Volley adapter for JSON requests that will be parsed into Java objects by Gson. 
  3.  */  
  4. public class GsonObjectRequest<T> extends Request<T> {  
  5.     protected final Gson gson = new Gson();  
  6.     protected final Class<T> clazz;  
  7.     protected final Map<String, String> headers;  
  8.     protected final Listener<T> listener;  
  9.   
  10.     /** 
  11.      * Make a GET request and return a parsed object from JSON. 
  12.      * 
  13.      * @param url URL of the request to make 
  14.      * @param clazz Relevant class object, for Gson's reflection 
  15.      * @param headers Map of request headers 
  16.      */  
  17.     public GsonObjectRequest(int method, String url, Class<T> clazz, Map<String, String> headers,  
  18.             Listener<T> listener, ErrorListener errorListener) {  
  19.         super(method, url, errorListener);  
  20.         this.clazz = clazz;  
  21.         this.headers = headers;  
  22.         this.listener = listener;  
  23.     }  
  24.       
  25.     public GsonObjectRequest(String url, Class<T> clazz, Map<String, String> headers,  
  26.             Listener<T> listener, ErrorListener errorListener) {  
  27.         this(Method.GET, url, clazz, headers, listener, errorListener);  
  28.     }  
  29.   
  30.     @Override  
  31.     public Map<String, String> getHeaders() throws AuthFailureError {  
  32.         return headers != null ? headers : super.getHeaders();  
  33.     }  
  34.   
  35.     @Override  
  36.     protected void deliverResponse(T response) {  
  37.         listener.onResponse(response);  
  38.     }  
  39.       
  40.     //将请求获取的json转成 用gson 转成了对应的对象  
  41.     @Override   
  42.     protected Response<T> parseNetworkResponse(NetworkResponse response) {  
  43.         try {  
  44.             String json = new String(  
  45.                     response.data, HttpHeaderParser.parseCharset(response.headers));  
  46.             return Response.success(  
  47.                     gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));  
  48.         } catch (UnsupportedEncodingException e) {  
  49.             return Response.error(new ParseError(e));  
  50.         } catch (JsonSyntaxException e) {  
  51.             return Response.error(new ParseError(e));  
  52.         }  
  53.     }  
  54. }  
自定义Request,至少需要重写 parseNetworkResponse() 、deliverResponse()

其他说明

Volley 类中定义了磁盘缓存目录。

Request  .cancel() ,可以取消一个请求。

Request  .setTag(String tag),设置一个tag

RequestQueue .cancelAll(String tag),取消同一tag标识的Request

RequestQueue .cancelAll(new RequestFilter() {}); 以RequestFilter来过滤 需要取消的Request


Volley 能作什么

Google 2013 I/O 大会上发布的一个网络通信库。处理一些网络方面的请求,如数据解析、下载显示图片。

· 数据处理:对网络请求获取的数据的处理。

· 图片加载:对网络图片的下载及显示。


使用步骤

使用权限

 <uses-permissionandroid:name="android.permission.INTERNET"/>

 <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


初始化请求队列

RequestQueue mRequestQueue =  Volley.newRequestQueue(Context context);


网络请求数据处理

默认提供两种数据请求类型,一为StringRequest,一为JsonRequest

JsonRequest又分:

· JsonArrayRequest

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. JsonArrayRequest request = new JsonArrayRequest("url",   
  2.                 new Response.Listener<JSONArray>() {  
  3.   
  4.                     @Override  
  5.                     public void onResponse(JSONArray response) {//请求响应返回的JSONArray  
  6.                           
  7.                     }  
  8.                 },   
  9.                 new Response.ErrorListener() {  
  10.   
  11.                     @Override  
  12.                     public void onErrorResponse(VolleyError error) {  
  13.                           
  14.                     }  
  15.                 });  
  16.         mRequestQueue.add(request);  

· JsonObjectRequest

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. JsonObjectRequest request = new JsonObjectRequest(Method.GET, WEATHER_JSON_ADDRESS, null,   
  2.                 new Response.Listener<JSONObject>() {  
  3.   
  4.                     @Override  
  5.                     public void onResponse(JSONObject response) {//请求响应返回的JSONObject  
  6.                         System.out.println(response);  
  7.                     }  
  8.                 },  
  9.                 new Response.ErrorListener() {  
  10.   
  11.                     @Override  
  12.                     public void onErrorResponse(VolleyError error) {  
  13.                         System.out.println("test4JsonObjectRequest - error");  
  14.                     }  
  15.                 });  
  16.           
  17.         mRequestQueue.add(request);  
    mRequestQueue.add(request);  将请求加入队列。 可以有很多个add 入队操作,然后start
    mRequestQueue.start();             启动请求
    mRequestQueue.stop();             停止请求


图片加载请求

· ImageRequest 加载图片

  使用方式与上面的JsonRequest类似

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private void requestByImageRequest(final ImageView imageView, String url) {  
  2.         ImageRequest imgRequest = new ImageRequest(url,   
  3.                 new Response.Listener<Bitmap>() {  
  4.                     @Override  
  5.                     public void onResponse(Bitmap bitmap) {//下载成功后  
  6.                         imageView.setImageBitmap(bitmap);  
  7.                     }  
  8.                 },   
  9.                 imageView.getWidth(), imageView.getHeight(), Config.RGB_565,   
  10.                 new ErrorListener(){  
  11.                     @Override  
  12.                     public void onErrorResponse(VolleyError error) { //下载出错  
  13.                           
  14.                     }  
  15.                 });  
  16.         mRequestQueue.add(imgRequest);  
  17.         mRequestQueue.start();  
  18.     }  

· ImageLoader 加载图片

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private void requestByImageLoader(ImageView imageView, String url) {  
  2.         int maxMemory = (int) Runtime.getRuntime().maxMemory();//app最大内存 字节数  
  3.         int mCacheSize = maxMemory / 8;  //以1/8 用作缓存  
  4.         final LruCache<String, Bitmap> mLruImageCache = new LruCache<String, Bitmap>(mCacheSize) {  
  5.             @Override  
  6.             protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size  
  7.                 if (android.os.Build.VERSION.SDK_INT >= 12) {  
  8.                     return value.getByteCount(); //需要api >=12 , 总字节数  
  9.                 } else {  
  10.                     return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行)   api1  
  11.                 }  
  12.             }  
  13.         };  
  14.         ImageCache imageCache = new ImageCache() {  
  15.             @Override  
  16.             public void putBitmap(String key, Bitmap value) {  
  17.                 mLruImageCache.put(key, value);  
  18.             }  
  19.   
  20.             @Override  
  21.             public Bitmap getBitmap(String key) {  
  22.                 return mLruImageCache.get(key);  
  23.             }  
  24.         };  
  25.         ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);  
  26.         // ImageLoader.getImageListener的第二个参数是默认的图片resource id,请求的图片为空时设置  
  27.         // 第三个参数是请求失败时候的资源id,可以指定为0  
  28.         ImageListener listener = ImageLoader.getImageListener(  
  29.                 imageView, android.R.drawable.ic_menu_rotate,  
  30.                 android.R.drawable.ic_delete);  
  31.         mImageLoader.get(url, listener); //get方法已经开始执行了加载url-bitmap  
  32.           
  33. //      ImageContainer imageContainer = mImageLoader.get(url, listener); //get方法已经开始执行了加载url-bitmap  
  34. //      Bitmap bitmap = imageContainer.getBitmap();  
  35. //      String requestUrl = imageContainer.getRequestUrl();  
  36.     }  

ImageLoader 需要结合 ImageCache来进行构造。ImageCache是一个interface

ImageCache 的put/get Bitmap的方法 ,推荐使用LruCache来实现。

ImageListener 是一个interface,提供两个方法:onResponse(),onResponseError()

ImageLoader 图片加载流程:ImageLoader.get(url, listener),判断是否存在于cache中,如果有,则直接取出并在listener中显示;如果没有,则new 一个ImageRequest,加入到requestQueue中,将listener中相应的方法在ImageRequest中的Response.Listener中进行调用。


· NetworkImageView 加载图片

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private void requestByNetworkImg(NetworkImageView imageView, String url) {  
  2.         final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(8*1024*1024) {  
  3.             @Override  
  4.             protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size  
  5.                 return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行)   api1  
  6.             }  
  7.         };  
  8.         ImageCache imageCache = new ImageCache() {  
  9.             @Override  
  10.             public void putBitmap(String key, Bitmap value) {  
  11.                 mImageCache.put(key, value);  
  12.             }  
  13.   
  14.             @Override  
  15.             public Bitmap getBitmap(String key) {  
  16.                 return mImageCache.get(key);  
  17.             }  
  18.         };  
  19.         ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);  
  20.         /* 
  21.          * seturl时,里面的实现是:有了ImageLoader,就能执行加载url-bitmap的操作 
  22.          */  
  23.         imageView.setDefaultImageResId(0); //默认图  
  24.         imageView.setErrorImageResId(0); //错误图  
  25.         imageView.setImageUrl(url, mImageLoader);   
  26.     }  

这是一个继承自ImageView的自定义组件。

imageView.setDefaultImageResId(0); //默认图
imageView.setErrorImageResId(0); //错误图
imageView.setImageUrl(url, mImageLoader); 

结合了ImageLoader,内部调用ImageLoader.get()来实现图片的加载。

在ListView中的item使用NetworkImageView:

    只需要new 一个ImageLoader对象。不同的item,set不同的URL即可。

    因为在ImageLoader中会new不同的ImageRequest加到RequestQueue中执行下载。


自定义Request

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Volley adapter for JSON requests that will be parsed into Java objects by Gson. 
  3.  */  
  4. public class GsonObjectRequest<T> extends Request<T> {  
  5.     protected final Gson gson = new Gson();  
  6.     protected final Class<T> clazz;  
  7.     protected final Map<String, String> headers;  
  8.     protected final Listener<T> listener;  
  9.   
  10.     /** 
  11.      * Make a GET request and return a parsed object from JSON. 
  12.      * 
  13.      * @param url URL of the request to make 
  14.      * @param clazz Relevant class object, for Gson's reflection 
  15.      * @param headers Map of request headers 
  16.      */  
  17.     public GsonObjectRequest(int method, String url, Class<T> clazz, Map<String, String> headers,  
  18.             Listener<T> listener, ErrorListener errorListener) {  
  19.         super(method, url, errorListener);  
  20.         this.clazz = clazz;  
  21.         this.headers = headers;  
  22.         this.listener = listener;  
  23.     }  
  24.       
  25.     public GsonObjectRequest(String url, Class<T> clazz, Map<String, String> headers,  
  26.             Listener<T> listener, ErrorListener errorListener) {  
  27.         this(Method.GET, url, clazz, headers, listener, errorListener);  
  28.     }  
  29.   
  30.     @Override  
  31.     public Map<String, String> getHeaders() throws AuthFailureError {  
  32.         return headers != null ? headers : super.getHeaders();  
  33.     }  
  34.   
  35.     @Override  
  36.     protected void deliverResponse(T response) {  
  37.         listener.onResponse(response);  
  38.     }  
  39.       
  40.     //将请求获取的json转成 用gson 转成了对应的对象  
  41.     @Override   
  42.     protected Response<T> parseNetworkResponse(NetworkResponse response) {  
  43.         try {  
  44.             String json = new String(  
  45.                     response.data, HttpHeaderParser.parseCharset(response.headers));  
  46.             return Response.success(  
  47.                     gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));  
  48.         } catch (UnsupportedEncodingException e) {  
  49.             return Response.error(new ParseError(e));  
  50.         } catch (JsonSyntaxException e) {  
  51.             return Response.error(new ParseError(e));  
  52.         }  
  53.     }  
  54. }  
自定义Request,至少需要重写 parseNetworkResponse() 、deliverResponse()

其他说明

Volley 类中定义了磁盘缓存目录。

Request  .cancel() ,可以取消一个请求。

Request  .setTag(String tag),设置一个tag

RequestQueue .cancelAll(String tag),取消同一tag标识的Request

RequestQueue .cancelAll(new RequestFilter() {}); 以RequestFilter来过滤 需要取消的Request


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值