Android Volley 具体解释 Google公布的一套用于网络通信的工具库
下载地址:git clone https://android.googlesource.com/platform/frameworks/volley
或 : https://github.com/mcxiaoke/android-volley
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
JsonArrayRequest request = new JsonArrayRequest("url",
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {//请求响应返回的JSONArray
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mRequestQueue.add(request);
· JsonObjectRequest
JsonObjectRequest request = new JsonObjectRequest(Method.GET, WEATHER_JSON_ADDRESS, null,
new Response.Listener<JSONObject>() { @Override
public void onResponse(JSONObject response) {//请求响应返回的JSONObject
System.out.println(response);
}
},
new Response.ErrorListener() { @Override
public void onErrorResponse(VolleyError error) {
System.out.println("test4JsonObjectRequest - error");
}
}); mRequestQueue.add(request);
mRequestQueue.add(request); 将请求增加队列。 能够有非常多个add 入队操作。然后start
mRequestQueue.start(); 启动请求
mRequestQueue.stop(); 停止请求
图片载入请求
· ImageRequest 载入图片
使用方式与上面的JsonRequest类似
private void requestByImageRequest(final ImageView imageView, String url) {
ImageRequest imgRequest = new ImageRequest(url,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {//下载成功后
imageView.setImageBitmap(bitmap);
}
},
imageView.getWidth(), imageView.getHeight(), Config.RGB_565,
new ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) { //下载出错
}
});
mRequestQueue.add(imgRequest);
mRequestQueue.start();
}
· ImageLoader 载入图片
private void requestByImageLoader(ImageView imageView, String url) {
int maxMemory = (int) Runtime.getRuntime().maxMemory();//app最大内存 字节数
int mCacheSize = maxMemory / 8; //以1/8 用作缓存
final LruCache<String, Bitmap> mLruImageCache = new LruCache<String, Bitmap>(mCacheSize) {
@Override
protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size
if (android.os.Build.VERSION.SDK_INT >= 12) {
return value.getByteCount(); //须要api >=12 , 总字节数
} else {
return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行) api1
}
}
};
ImageCache imageCache = new ImageCache() {
@Override
public void putBitmap(String key, Bitmap value) {
mLruImageCache.put(key, value);
}
@Override
public Bitmap getBitmap(String key) {
return mLruImageCache.get(key);
}
};
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);
// 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); //get方法已经開始运行了载入url-bitmap
// ImageContainer imageContainer = mImageLoader.get(url, listener); //get方法已经開始运行了载入url-bitmap
// Bitmap bitmap = imageContainer.getBitmap();
// String requestUrl = imageContainer.getRequestUrl();
}
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 载入图片
private void requestByNetworkImg(NetworkImageView imageView, String url) {
final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(8*1024*1024) {
@Override
protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size
return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行) api1
}
};
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);
/*
* seturl时。里面的实现是:有了ImageLoader,就能运行载入url-bitmap的操作
*/
imageView.setDefaultImageResId(0); //默认图
imageView.setErrorImageResId(0); //错误图
imageView.setImageUrl(url, mImageLoader);
}
这是一个继承自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
/**
* Volley adapter for JSON requests that will be parsed into Java objects by Gson.
*/
public class GsonObjectRequest<T> extends Request<T> {
protected final Gson gson = new Gson();
protected final Class<T> clazz;
protected final Map<String, String> headers;
protected final Listener<T> listener; /**
* Make a GET request and return a parsed object from JSON.
*
* @param url URL of the request to make
* @param clazz Relevant class object, for Gson's reflection
* @param headers Map of request headers
*/
public GsonObjectRequest(int method, String url, Class<T> clazz, Map<String, String> headers,
Listener<T> listener, ErrorListener errorListener) {
super(method, url, errorListener);
this.clazz = clazz;
this.headers = headers;
this.listener = listener;
} public GsonObjectRequest(String url, Class<T> clazz, Map<String, String> headers,
Listener<T> listener, ErrorListener errorListener) {
this(Method.GET, url, clazz, headers, listener, errorListener);
} @Override
public Map<String, String> getHeaders() throws AuthFailureError {
return headers != null ? headers : super.getHeaders();
} @Override
protected void deliverResponse(T response) {
listener.onResponse(response);
} //将请求获取的json转成 用gson 转成了相应的对象
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(
response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(
gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
}
自己定义Request。至少须要重写 parseNetworkResponse() 、deliverResponse()
其它说明
Volley 类中定义了磁盘缓存文件夹。
Request .cancel() ,能够取消一个请求。
Request .setTag(String tag)。设置一个tag
RequestQueue .cancelAll(String tag),取消同一tag标识的Request
RequestQueue .cancelAll(new RequestFilter() {}); 以RequestFilter来过滤 须要取消的Request
Android Volley 具体解释 Google公布的一套用于网络通信的工具库的更多相关文章
- [Android]Volley的使用
Volley是Google I/O 2013上提出来的为Android提供简单快速网络访问的项目.Volley特别适合数据量不大但是通信频繁的场景. 优势 相比其他网络载入类库,Volley 的优势官 ...
- Android Volley入门到精通:定制自己的Request
经过前面两篇文章的学习,我们已经掌握了Volley各种Request的使用方法,包括StringRequest.JsonRequest.ImageRequest等.其中StringRequest用于请 ...
- Android Volley完全解析
1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...
- Android Volley彻底解决(三),定制自己Request
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17612763 经过前面两篇文章的学习,我们已经掌握了Volley各种Request ...
- Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...
- Android Volley完全解析(三),定制自己的Request
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17612763 经过前面两篇文章的学习,我们已经掌握了Volley各种Request ...
- Android Volley gives me 400 error
本文来自:http://stackoverflow.com/questions/21739276/android-volley-gives-me-400-error 本人是根据文中的其中一方法: I ...
- [转] Android Volley完全解析(一),初识Volley的基本用法
版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] Volley简介 下载Volley StringRequest的用法 JsonRequest的用法 转载请注明出处:http ...
- Android Volley入门到精通:使用Volley加载网络图片
在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完 ...
随机推荐
- React+Webpack+ES6环境搭建(自定义框架)
引言 目前React前端框架是今年最火的.而基于React的React Native也迅速发展.React有其独特的组件化功能与JSX的新语法,帮助前端设计有了更好的设计与便捷,而React Nati ...
- 正则效验url
上篇文章讲到多主题的解决方案:简单暴力的TP5多主题方案 为了简化配置,所以将域名前的协议 http/https 截取了. 后台配置时就需要效验配置的格式是否正确,需要用到的正则代码如下: /*** ...
- django-数据库的查询集
1.curd(增删改查) 对于数据库,作为一名开发人员并不会感到陌生,那么数据库中的查询集是怎么一回事呢? 2.数据库的查询集 查询集这个概念存在django框架中,存在于ORM(object rel ...
- WPF 封装 dotnet remoting 调用其他进程
原文:WPF 封装 dotnet remoting 调用其他进程 本文告诉大家一个封装好的库,使用这个库可以快速搭建多进程相互使用. 目录 创建端口 调用软件 运行的类 运行C++程序 通道 使用 在 ...
- setjmp()和longjmp()函数
之前我们讲到了过程活动记录(AR),那么如何来操纵AR呢,一个可能的方法是,根据局部变量的地址进行推算,例如对于上面的a函数,执行a函数时的当前AR地址就是参数i的地址偏移8个字节,也就是 ((cha ...
- 【BZOJ 1406】 [AHOI2007]密码箱
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] \(x^2%n=1\) \(x^2-1 = k*n\) \((x+1)*(x-1) % n == 0\) 设\(n=a*b\) 对于 ...
- spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定
本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,并且IoC Service Pr ...
- hdu 4288 线段树+离线+离散化
http://acm.hdu.edu.cn/showproblem.php?pid=4288 開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7 假设 ...
- ACM数学知识体系
在盛情收到学弟邀请给他们整理ACM数学方面的知识体系,作为学长非常认真的弄了好久,希望各学弟不辜负学长厚爱!!!非常抱歉因为电脑全盘格式化好多word.PPT都丢失,我尽量具体地给大家找到各知识点学习 ...
- log_archive_min_succeed_dest
博客上.看了一大神的文章:http://blog.csdn.net/msdnchina/article/details/45141427 我表示有疑问:归档日志路径爆满,那么对于开启归档模式的数据库, ...