前一篇粗略的介绍了一下Volley,并在最后附上了一段使用代码,这一篇详细的介绍一下Volley的使用。前面也说了Volley主要获取JSON对象和图片加载,这里也分为两部分介绍。
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
protected 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;
}
* iOS入门群:83702688
* android开发进阶群:241395671
*/
分享到:
相关推荐
Android 网络通信框架Volley简介
android网络通讯框架volley jar包,可以直接使用哦!
上传的是一个eclipse下的android工程,主要展示的是对android 的网络通信框架 Volley的简单使用,展示了一些api的使用,有get和post方法的请求方式以及网络图片的缓存等等,我正是使用了这个demo 完成了我的一个在线...
1.发送get 2.发送post 3.获取图片 4.发送https 5.获取cookie 6.上传cookie 7.自定义request 8.设置超时
谷歌2013年推出的安卓网络框架,学会它可以大大提高开发效率
实现登录与后台用volley通信,以及volley的基本使用
Android网络通信框架Volley的解析和比较.pdf
Google I/O 2013推荐Android 网络通信框架Volley 下载下来后然后编译为jar包,再在自己的工程里import进来。
给android初学者的福利,网络通信框架volley-demo [注:本内容来自网络,在此分享仅为帮助有需要的网友,如果侵犯了您的权利,麻烦联系我,我会第一时间删除,谢谢您。]
当前十分热门的Volley网络框架,也是在2013年Google I/O大会上推出了一个新的网络通信框架。Volley把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信...
使用Volley框架post从网络上获取数据
Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。
上传的是一个eclipse下的android工程,主要展示的是对android 的网络通信框架 Volley的简单使用,展示了一些api的使用,有get和post方法的请求方式以及网络图片的缓存等等,我正是使用了这个demo 完成了我的一个在线...
Volley是一个由Google官方推出的网络通信库,它使得Android进行网络请求时更加方便、快速、健壮,同时对网络图片加载也提供了良好的支持。
简单的volley开源框架的使用案例,代码经过测试没有问题,教你如何使用volley框架进行网络编程,实现安卓客户端与服务器的通信。
所谓Volley,它是2013年Google I/O上发布的一款网络框架,基于Android平台,能使网络通信更快,更简单,更健全。
下图所示的这些应用都是属于数据量不大 但网络通信频繁的 因此非常适合使用Volley ">在2013年Google I O大会上推出了一个新的网络通信框架 Volley Volley可是说是把AsyncHttpClient和Universal Image Loader的优点集...
volley使用代码,测试volley的使用与封装.Volley是2013年Google I/O大会上推出了一个新的网络通信框架,Volley特别适合数据量不大但是通信频繁的场景,不支持 post 大数据,不适合上传文件。
Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身...
Android Volley网络通信框架,jar包直接导入可用。