前一篇粗略的介绍了一下Volley,并在最后附上了一段使用代码,这一篇详细的介绍一下Volley的使用。前面也说了Volley主要获取JSON对象和图片加载,这里也分为两部分介绍。

1、获取JSON对象

1.1声明RequestQueue

声明一个新的RequestQueue对象
  1. private RequestQueue mRequestQueue;
在onCreate初始化mRequestQueue

  1. mRequestQueue = Volley.newRequestQueue(this);

1.2 声明并使用Request

  1. JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() {
  2. @Override
  3. public void onResponse(JSONObject response) {
  4. Log.i(TAG,response.toString());
  5. parseJSON(response);
  6. va.notifyDataSetChanged();
  7. pd.dismiss();
  8. }
  9. },new Response.ErrorListener() {
  10. @Override
  11. public void onErrorResponse(VolleyError error) {
  12. Log.i(TAG,error.getMessage());
  13. }
  14. });
  15. mRequestQueue.add(jr);
Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。

JsonObjectRequest:返回JSON对象。

JsonArrayRequest:返回JsonArray。

StringRequest:返回String,这样可以自己处理数据,更加灵活。

另外可以继承Request<T>自定义Request。

1.3 取消Request

      Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,Activity被结束了,此时如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。Volley支持多种request取消方式。
1)可以针对某些个request做取消操作:

  1. @Override
  2. public void onStop() {
  3. for (Request <?> req : mRequestQueue) {
  4. req.cancel();
  5. }
  6. }
 

2)取消这个队列里的所有请求:

  1. @Override
  2. protected void onStop() {
  3. // TODO Auto-generated method stub
  4. super.onStop();
  5. mRequestQueue.cancelAll(this);
  6. }

3)可以根据RequestFilter或者Tag来终止某些请求

  1. @Override
  2. protected void onStop() {
  3. // TODO Auto-generated method stub
  4. super.onStop();
  5.  
  6. mRequestQueue.cancelAll( new RequestFilter() {});
  7. or
  8. mRequestQueue.cancelAll(new Object());
  9. }
 
Volley支持http的GET、POST、PUT、DELETE等方法,上面给出了GET方法,其他方法请参考
 
 
 

2、图片加载

2.1使用ImageRequest下载图片

    Volley提供了多种Request方法,ImageRequest能够处理单张图片,返回bitmap。下面是ImageRequest的使用例子,和JsonRequest的一样。
  1. singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview);
  2. ImageRequest imgRequest=new ImageRequest(url, new Response.Listener<Bitmap>() {
  3. @Override
  4. public void onResponse(Bitmap arg0) {
  5. // TODO Auto-generated method stub
  6. singleImg.setImageBitmap(arg0);
  7. }
  8. }, 300, 200, Config.ARGB_8888, new ErrorListener(){
  9. @Override
  10. public void onErrorResponse(VolleyError arg0) {
  11. // TODO Auto-generated method stub
  12.  
  13. }
  14. });
  15. mRequestQueue.add(imgRequest);

2.2使用ImageLoader

ImageLoader这个类需要一个Request的实例以及一个ImageCache的实例。图片通过一个URL和一个ImageListener实例的get()方法就可以被加载。从哪里,ImageLoader会检查ImageCache,而且如果缓存里没有图片就会从网络上获取。

Volley的ImageCache接口允许你使用你喜欢的L1缓存实现。不幸的是Volley没有提供默认的实现。在I/O的介绍中展示了BitmapLruCache的一点代码片段,但是Volley这个库本身并不包含任何相关的实现。

ImageCache接口有两个方法,getBitmap(String url)和putBitmap(String url, Bitmap bitmap).这两个方法足够简单直白,他们可以添加任何的缓存实现。

  1. RequestQueue mRequestQueue = Volley.newRequestQueue(this);
  2. final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(
  3. 20);
  4. ImageCache imageCache = new ImageCache() {
  5. @Override
  6. public void putBitmap(String key, Bitmap value) {
  7. mImageCache.put(key, value);
  8. }
  9.  
  10. @Override
  11. public Bitmap getBitmap(String key) {
  12. return mImageCache.get(key);
  13. }
  14. };
  15. ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);
  16. // imageView是一个ImageView实例
  17. // ImageLoader.getImageListener的第二个参数是默认的图片resource id
  18. // 第三个参数是请求失败时候的资源id,可以指定为0
  19. ImageListener listener = ImageLoader
  20. .getImageListener(imageView, android.R.drawable.ic_menu_rotate,
  21. android.R.drawable.ic_delete);
  22. mImageLoader.get(url, listener);
 

2.3 使用NetworkImageView

  1. public class NetworkImageView extends ImageView

继承自ImageView,添加了一个

  1. public void setImageUrl(String url, ImageLoader imageLoader) {}

方法,参数包含一个Url地址和一个ImageLoader对象
核心方法:

  1. private void loadImageIfNecessary(final boolean isInLayoutPass) {}

内部实现,boolean 类型参数代表是否重新请求网络 ,true:重新请求 false:取缓存
内部实现和ImageLoader类似,都是通过ImageContainer中new一个ImageListener,在ImageListener,只是做了Url的空判断,如果Url为null,则调用ImageContainer.cancelRequest();取消请求。
覆写方法:

  1. @Override
  2. protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
  3. super.onLayout(changed, left, top, right, bottom);
  4. //onLayout时重新请求
  5. loadImageIfNecessary(true);
  6. }
  7. @Override
  8. protected void onDetachedFromWindow() {
  9. //销毁View的时候Release操作
  10. if (mImageContainer != null) {
  11. // If the view was bound to an image request, cancel it and clear
  12. // out the image from the view.
  13. mImageContainer.cancelRequest();
  14. setImageBitmap(null);
  15. // also clear out the container so we can reload the image if necessary.
  16. mImageContainer = null;
  17. }
  18. super.onDetachedFromWindow();
  19. }
  20. //drawable状态改变重绘
  21. @Override
  22. protected void drawableStateChanged() {
  23. super.drawableStateChanged();
  24. invalidate();
  25. }

总结:网络请求下载图片显示,可以使用此控件,比传统的ImageView多了网络处理,也添加了2个方法,设置开始下载的默认图和下载出错后显示图。

  1. /**
  2. * Sets the default image resource ID to be used for this view until the attempt to load it
  3. * completes.
  4. */
  5. public void setDefaultImageResId(int defaultImage) {
  6. mDefaultImageId = defaultImage;
  7. }
  8. /**
  9. * Sets the error image resource ID to be used for this view in the event that the image
  10. * requested fails to load.
  11. */
  12. public void setErrorImageResId(int errorImage) {
  13. mErrorImageId = errorImage;
  14. }
 
 
/**
* @author 张兴业
*  iOS入门群:83702688
*  android开发进阶群:241395671
*  我的新浪微博:@张兴业TBOW
*/

Volley使用详细说明的更多相关文章

  1. 网络通信框架Volley使用详细说明

    前一篇粗略的介绍了一下Volley,并在最后附上了一段使用代码,这一篇详细的介绍一下Volley的使用.前面也说了Volley主要获取JSON对象和图片加载,这里也分为两部分介绍. 1.获取JSON对 ...

  2. volley全然解析

    一.volley是什么? 1.简单介绍   Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的.从名字由来和配图中无数急促的火箭能够看出 Volley ...

  3. 开发一款高端大气上档次的android应用需要必备的知识——记于2013年末

    Android入门还是很简单的,看两本书,翻阅几篇文章,搭建了开发环境就算入门了.可是怎样开发一款完备的android应用呢,开发一款高端的android应用又需要那些知识呢,作者根据几年的开发经验做 ...

  4. 详细解读Volley(五)—— 通过源码来分析业务流程

    一.初始化请求队列并运行 我们用Volley时,最先开始的就是初始化请求队列,一种常见的写法如下: public class MyApplication extends Application { p ...

  5. 详细解读Volley(三)—— ImageLoader & NetworkImageView

    ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码中没有提供磁盘缓存的设置,所以咱们还需要去源码中进行修改,让我们可以更加自如的设定是否进行磁盘 ...

  6. 详细解读Volley(二)—— ImageRequest & Request简介

    上篇文章我们讲到了如何用volley进行简单的网络请求,我们可以很容易的接受到string.JsonObjec类型的返回结果,之前的例子仅仅是一次请求,这里需要说明volley本身就是适合高并发的,所 ...

  7. 详细解读Volley(四)—— 自定义Request

    Volley中提供了几个Request,如果我们有特殊的需求,完全可以自定义Request的,自定义Request自然要继承Request,那么本篇就教大家来一步一步地定义一个自己的Request类. ...

  8. 详细解读Volley(一)—— 基本Request对象 & RequestQueue

    Volley它非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕.所以不建议用它去进行下载文件.加载大图的操作.有人可能会问,如 ...

  9. 快速Android开发系列网络篇之Volley

    Volley是Google推出的一个网络请求库,已经被放到了Android源码中,地址在这里,先看使用方法 RequestQueue mRequestQueue = Volley.newRequest ...

随机推荐

  1. swift2.0中文版教程

    有些同学问我要swift的中文版教程,为了节省大家的找资料的时间,我就把我网上下载的PDF放到这里共享好了. 点击链接或者右击选择下载文件进行下载:swift2.0中文版教程 在此也感谢翻译者们的贡献 ...

  2. unity, unlit surface shader (texColor only surface shader)

    要实现双面透明无光照只有纹理色的surface shader. 错误的写法:(导致带有曝光) Shader "Custom/doubleFaceTranspTexColor" { ...

  3. DataProtectionConfigurationProvider加密web.config文件

    web.config 文件中经常会包含一些敏感信息,最常见的就是数据库连接字符串了,为了防止该信息泄漏,最好是将相关内容加密. Aspnet_regiis.exe命令已经提供了加密配置文件的方法,系统 ...

  4. JUC组件扩展(二)-JAVA并行框架Fork/Join(一):简介和代码示例

    一.背景 虽然目前处理器核心数已经发展到很大数目,但是按任务并发处理并不能完全充分的利用处理器资源,因为一般的应用程序没有那么多的并发处理任务.基于这种现状,考虑把一个任务拆分成多个单元,每个单元分别 ...

  5. 使用NoSQL Manager for MongoDBclient连接mongodb

    1.安装NoSQL Manager for MongoDB 下载地址:http://www.mongodbmanager.com/download 2.打开client,选server-new mon ...

  6. atitit.词法分析原理 词法分析器 (Lexer)

    atitit.词法分析原理 词法分析器 (Lexer) 1. 词法分析(英语:lexical analysis)1 2. :实现词法分析程序的常用途径:自动生成,手工生成.[1] 2 2.1. 词法分 ...

  7. 绝不能错过的10款最新OpenStack网络运维 & 监控工具

    摘要 今天我们要推荐给大家的是关于奥斯汀OpenStack Summit的OpenStack网络方面功能与工具相关的技术演讲. 希望可以帮助国内的开发者.架构师和用户更好地了解OpenStack在SD ...

  8. Source Insight 项目简单使用说明

    SI(Source Insight) 是我一直写代码的好伙伴, 相信这强大的软件也是广大程序猿编写软件的利器. 正所谓" 工欲善其事, 必先利其器", 我们要学会利用这款软件. 先 ...

  9. flink checkpoint 源码分析 (二)

    转发请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/8260370.html flink checkpoint 源码分析 (一)一文主要讲述了在JobMan ...

  10. locationInView和translationInView的区别

      1  translationInView是UIPanGestureRecognizer下面的一个属性 locationInView则是UIGestureRecognizer下面的属性 2  tra ...