前一篇粗略的介绍了一下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. Android 网络通信框架Volley简介(Google IO 2013)

    1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient( ...

  2. [转]Android 网络通信框架Volley简介(Google IO 2013)

    Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...

  3. 【转】Android 网络通信框架Volley简介(Google IO 2013)

    Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...

  4. Android 网络通信框架Volley(一)

    转自:http://blog.csdn.net/t12x3456/article/details/9221611 1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫 ...

  5. Android 网络通信框架Volley简介

    1.1. Volley引入的背景在以前,我们可能面临如下很多麻烦的问题. 比如以前从网上下载图片的步骤可能是这样的流程: 在ListAdapter#getView()里开始图像的读取. 通过Async ...

  6. Android 网络通信框架Volley基本介绍

    Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...

  7. Android 网络通信框架Volley的简单使用

    Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮. Volley提供的功能: JSON,图像等的异步下载: 网络请求的排序(scheduling) 网络请求的优先级处理 ...

  8. Android 网络通信框架Volley(二)

    Volley提供2个静态方法: public static RequestQueue newRequestQueue(Context context) {} public static Request ...

  9. Android 网络通信框架Volley(三)

    NetworkImageView 分析:public class NetworkImageView extends ImageView 他继承自ImageView,并且添加了一个新方法: public ...

随机推荐

  1. 任务调度Cron表达式及Quartz代码详解

    在线Cron表达式生成器 http://cron.qqe2.com/ cron表达式详解 http://www.cnblogs.com/linjiqin/archive/2013/07/08/3178 ...

  2. 快速理解linux流编辑器sed命令

    原创 杜亦舒性能与架构 之前介绍过 awk 命令,sed 命令同样是非常重要的文本处理工具,涉及到linux shell开发时,几乎是避不开这两大利器的 sed 是 stream editor 的简写 ...

  3. 从【MySQL server has gone away】说起

    本文目的 这几天开发了一个PHP CLI程序,用于后台定时调度执行一些任务.此脚本采用了PHP的多进程(pcntl_fork),共享内存和信号量进行IPC和同步.目的是将串行的任 务并行执行,缩短执行 ...

  4. log4j DatePattern 解惑

    og4j.appender.Root=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.Root.File=../logs/bloglog ...

  5. 亚信UED前端流程自动化构建工具

    亚信UED前端流程自动化构建工具 .wmd-input, .wmd-input:focus, #md-section-helper {font-size: 14px !important;line-h ...

  6. linux之grub的使用

    一.引言 昨天在家里在自己的电脑上安装CentOS7,一切都顺利,结果安装好重启,无法进入win7了,在grub的配置文件也添加了win7的条目,却提示 unkown command chainloa ...

  7. Makefile 13——理解make的解析行为

    make是以从上到下的顺序读入Makefile中的内容的.然而,处理Makefile中的语句却并非完全从上到下. 大体上,make处理一个Makefile分为两个阶段.第一个阶段包含: 1.make读 ...

  8. C运行库和VC对应关系

    ## C运行库和VC对应关系----------------------------------------------------------------Msvcr60.DLL -- VC6Msvc ...

  9. emblog后台拿shell

    emlog版本:5.3.1 先本地弄好shell 新建一个文件夹,里面放shell,shell名称和文件名要一致.压缩为zip 然后在安装插件处上传. 成功后的路径content/plugins/te ...

  10. Unity3D中简单的C#异步Socket实现

    Unity3D中简单的C#异步Socket实现 简单的异步Socket实现..net框架自身提供了很完善的Socket底层.笔者在做Unity3D小东西的时候需要使用到Socket网络通信.于是决定自 ...