、什么是volley

         Volley是Ficus Kirpatrick在Gooogle I/O 2013发布的一个处理和缓存网络请求的库,能使网络通信更快,更简单,更健壮。Volley名称的由来: a burst or emission of many things or a large amount at once。在Google IO的演讲上,其配图是一幅发射火弓箭的图,有点类似流星。见下图

2、volley能做什么

volley适合小而快的数据传输。Volley应该是简化了网络通信的一些开发,特别是针对以下两种情况:
  • JSON对象
  • 图片加载
Volley的便利功能:

Advantages of using Volley:

  1. Volley automatically schedule all network requests. It means that Volley will be taking care of all the network requests your app executes for fetching response or image from web.
  2. Volley provides transparent disk and memory caching.
  3. Volley provides powerful cancellation request API. It means that you can cancel a single request or you can set blocks or scopes of requests to cancel.
  4. Volley provides powerful customization abilities.
  5. Volley provides Debugging and tracing tools

3、volley架构

Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程。主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题。具体可以参考下图,此图节选自Google I/O 演讲。

4、使用volley

4.1 获取volley

引入Volley非常简单,首先,从git库先克隆一个下来:

[html]  view plain copy print ?
  1. git clone https://android.googlesource.com/platform/frameworks/volley

然后编译为jar包,再在自己的工程里import进来。如果git下载失败可以在这下载。 VolleyLib

4.2 JsonObjectRequest 简单文本请求

   使用下面的代码实现json数据获取
mRequestQueue =  Volley.newRequestQueue(this);  String url = "http://pipes.yahooapis.com/pipes/pipe.run?_id=giWz8Vc33BG6rQEQo_NLYQ&_render=json";  pd = ProgressDialog.show(this,"Please Wait...","Please Wait...");  JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() {  @Override  public void onResponse(JSONObject response) {  Log.i(TAG,response.toString());  parseJSON(response);  va.notifyDataSetChanged();  pd.dismiss();  }  },new Response.ErrorListener() {  @Override  public void onErrorResponse(VolleyError error) {  Log.i(TAG,error.getMessage());  }  });  mRequestQueue.add(jr);  

4.3 ImageView

使用volley异步加载图像
RequestQueue mRequestQueue = Volley.newRequestQueue(this);  final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(  20);  ImageCache imageCache = new ImageCache() {  @Override  public void putBitmap(String key, Bitmap value) {  mImageCache.put(key, value);  }  @Override  public Bitmap getBitmap(String key) {  return mImageCache.get(key);  }  };  ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);  // imageView是一个ImageView实例  // ImageLoader.getImageListener的第二个参数是默认的图片resource id  // 第三个参数是请求失败时候的资源id,可以指定为0  ImageListener listener = ImageLoader  .getImageListener(imageView, android.R.drawable.ic_menu_rotate,  android.R.drawable.ic_delete);  mImageLoader.get("http://a.hiphotos.baidu.com/album/h%3D800%3Bcrop%3D0%2C0%2C1280%2C800/sign=5f024b518326cffc762ab2b2893a29e2/72f082025aafa40fa3bcf315aa64034f79f019fb.jpg", listener);  

4.4 NetworkImageView

NetworkImageView是继承自ImageView,是Volley提供的一个全新的简单加载图片的控件。

NetworkImageView netImgView=(NetworkImageView)findViewById(R.id.volley_img_networkimgeview);  netImgView.setTag("url");  netImgView.setImageUrl("http://a.hiphotos.baidu.com/album/h%3D800%3Bcrop%3D0%2C0%2C1280%2C800/sign=5f024b518326cffc762ab2b2893a29e2/72f082025aafa40fa3bcf315aa64034f79f019fb.jpg",mImageLoader);  

4.4 NetworkImageView

NetworkImageView是继承自ImageView,是Volley提供的一个全新的简单加载图片的控件。

NetworkImageView netImgView=(NetworkImageView)findViewById(R.id.volley_img_networkimgeview);  netImgView.setTag("url");  netImgView.setImageUrl("http://a.hiphotos.baidu.com/album/h%3D800%3Bcrop%3D0%2C0%2C1280%2C800/sign=5f024b518326cffc762ab2b2893a29e2/72f082025aafa40fa3bcf315aa64034f79f019fb.jpg",mImageLoader);  

1、获取JSON对象

1.1声明RequestQueue

声明一个新的RequestQueue对象
private RequestQueue mRequestQueue;
在onCreate初始化mRequestQueue
mRequestQueue =  Volley.newRequestQueue(this);

1.2 声明并使用 Request
JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() {  @Override  public void onResponse(JSONObject response) {  Log.i(TAG,response.toString());  parseJSON(response);  va.notifyDataSetChanged();  pd.dismiss();  }  },new Response.ErrorListener() {  @Override  public void onErrorResponse(VolleyError error) {  Log.i(TAG,error.getMessage());  }  });  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做取消操作:
@Override  public void onStop() {  for (Request <?> req : mRequestQueue) {  req.cancel();  }  }  

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

@Override
protected void onStop() {  // TODO Auto-generated method stub  super.onStop();  mRequestQueue.cancelAll(this);
}  

3)可以根据RequestFilter或者Tag来终止某些请求
@Override
rotected void onStop() {
// TODO Auto-generated method stub
super.onStop();  mRequestQueue.cancelAll( new RequestFilter() {});
or
mRequestQueue.cancelAll(new Object());  
Volley支持http的GET、POST、PUT、DELETE等方法,上面给出了GET方法,其他方法请参考。

2、图片加载

2.1使用ImageRequest下载图片

    Volley提供了多种Request方法,ImageRequest能够处理单张图片,返回bitmap。下面是ImageRequest的使用例子,和JsonRequest的一样。
singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview);  ImageRequest imgRequest=new ImageRequest(url, new Response.Listener<Bitmap>() {  @Override  public void onResponse(Bitmap arg0) {  // TODO Auto-generated method stub  singleImg.setImageBitmap(arg0);  }  }, 300, 200, Config.ARGB_8888, new ErrorListener(){  @Override  public void onErrorResponse(VolleyError arg0) {  // TODO Auto-generated method stub  }             });  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).这两个方法足够简单直白,他们可以添加任何的缓存实现。

RequestQueue mRequestQueue = Volley.newRequestQueue(this);  final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(  20);  ImageCache imageCache = new ImageCache() {  @Override  public void putBitmap(String key, Bitmap value) {  mImageCache.put(key, value);  }  @Override  public Bitmap getBitmap(String key) {  return mImageCache.get(key);  }  };  ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);  // imageView是一个ImageView实例  // ImageLoader.getImageListener的第二个参数是默认的图片resource id  // 第三个参数是请求失败时候的资源id,可以指定为0  ImageListener listener = ImageLoader  .getImageListener(imageView, android.R.drawable.ic_menu_rotate,  android.R.drawable.ic_delete);  mImageLoader.get(url, listener);

2.3 使用NetworkImageView

public class NetworkImageView extends ImageView  

继承自ImageView,添加了一个

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

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

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

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
//onLayout时重新请求
loadImageIfNecessary(true);
}
@Override
protected void onDetachedFromWindow() {
//销毁View的时候Release操作
if (mImageContainer != null) {
// If the view was bound to an image request, cancel it and clear
// out the image from the view.
mImageContainer.cancelRequest();
setImageBitmap(null);
// also clear out the container so we can reload the image if necessary.
mImageContainer = null;
}
super.onDetachedFromWindow();
}
//drawable状态改变重绘
@Override
protected void drawableStateChanged() {
super.drawableStateChanged();
invalidate();
}  

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

/**

* Sets the default image resource ID to be used for this view until the attempt to load it
* completes.
*/
public void setDefaultImageResId(int defaultImage) {
mDefaultImageId = defaultImage;
}
/**
* Sets the error image resource ID to be used for this view in the event that the image
* requested fails to load.
*/
public void setErrorImageResId(int errorImage) {
mErrorImageId = errorImage;
}  

4.4 NetworkImageView

NetworkImageView是继承自ImageView,是Volley提供的一个全新的简单加载图片的控件。

NetworkImageView netImgView=(NetworkImageView)findViewById(R.id.volley_img_networkimgeview);  netImgView.setTag("url");  netImgView.setImageUrl("http://a.hiphotos.baidu.com/album/h%3D800%3Bcrop%3D0%2C0%2C1280%2C800/sign=5f024b518326cffc762ab2b2893a29e2/72f082025aafa40fa3bcf315aa64034f79f019fb.jpg",mImageLoader);  

Volly 框架简介相关推荐

  1. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  2. 《HiWind企业快速开发框架实战》(0)目录及框架简介

    <HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...

  3. WPF Interaction框架简介(一)——Behavior

    原文:WPF Interaction框架简介(一)--Behavior 在WPF 4.0中,引入了一个比较实用的库--Interactions,这个库主要是通过附加属性来对UI控件注入一些新的功能,除 ...

  4. go语言学习(二)——Gin 框架简介

    GoWeb开发有很多框架,如Beego.Gin.Revel.Echo.IRis等,学习框架可以快速做开发,对比常见goweb框架,通过其github的活跃度,维护的team,生产环境中的使用率以及师兄 ...

  5. Java开源——常见J2EE框架简介

    Java开源--常见J2EE框架简介 Spring Framework Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口 ...

  6. 【EventBus】EventBus 事件总线框架简介 ( EventBus 使用流程 )

    文章目录 一.EventBus 事件总线框架简介 二.EventBus 使用流程 一.EventBus 事件总线框架简介 Android 中的事件传递机制 : 使用 Intent 在组件间传递信息 ; ...

  7. 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

    文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...

  8. PHP微信开发框架LaneWeChat框架简介

    框架名称:LaneWeChat 微信PHP开发框架 框架版本:1.4 框架简介:这是一个为快速开发微信应用而生的PHP框架.将微信的开发者功能根据文档进行了封装.为了快速开发的目的,开发者完全不需要要 ...

  9. Spring框架简介

    Spring框架简介 Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本. ...

最新文章

  1. 前端实时刷新数据_产品又让我造数据
  2. 201671010145 2016-2017《Java程序设计》JAVA语言中,异常处理有哪几种方式?
  3. shell里面的参数
  4. windows找不到文件javaw_windows电脑上,怎么快速找文件?
  5. [原]动态打jar包程序,可用于手机图片音乐游戏的动态打包
  6. 你不懂API接口是什么?怎么和程序员做朋友
  7. 小程序更换域名后发现图片显示不出来的问题解决方法
  8. 推荐中文分词:腾讯文智
  9. edge chrome Android,微软Edge浏览器正式登陆Android平台
  10. linux搭建邮件服务器
  11. 语音信号处理 | 傅里叶变换、短时傅里叶变换、小波变换、希尔伯特变换、希尔伯特黄变换
  12. 网络安全人员必考的几本证书
  13. pyecharts之参透神剧人物关系
  14. 设计模式笔记--访问者模式
  15. 武汉江夏区计算机学院,信工班级风采展⑦ 计算机类1902班
  16. ios ipad里面调用系统相册图片不完整解决方法
  17. curl http header_利用Linux命令cURL实现文件定时上传到ftp服务器的小程序,实用
  18. Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子
  19. java怎样将乘法优化成位移乘法_Java性能优化:程序优化
  20. Zephyr MCUBoot

热门文章

  1. 崭新的诺基亚:诺记能否借Windows Phone重生?
  2. 跳槽涨薪多少才不亏?给你指条明路!
  3. android 音乐播放器评测,谁强大还省资源 六款主流Android音乐播放器评测
  4. 席马云(微博)昨日在杭州和黄章会面
  5. IT公司技术线晋升,答辩PPT如何准备?Don‘t be shy!
  6. 一文教你如何用国产EastWave电磁仿真软件三步快速仿真天线和天线阵
  7. ARM核心板应用案例-飞凌嵌入式智慧交通领域合集
  8. 打通同花顺问财接口!各类数据应有尽有!股票量化分析工具QTYX-V2.6.4
  9. 怎樣制作线段动画_线条动画视频制作 如何制作线条运动图?线条动态图制作...
  10. 简单上手ECharts