一、Volley 简介
Volley 为google 在2013年推出的网络通信框架。非常适合去进行数据量不大,但通信频繁的网络操作,如新闻页面的刷新。但是在下载等大数据量下的表现非常差。
二、Volley总览
在Volley中提供了常用的网络通信方式。如用于返回字符串的StringRequest,返回JSON的JsonRequest、
JsonObjectRequest,返回图片的ImageRequest。当然,我们也可以自己按照自己的需求来定义返回的类型。
在使用这些XXRequest之前,必须先新建一个RequestQueue。然后将这个XXRequest的实例添加进RequestQ
ueue中,就可以返回相应的值。
RequestQueue mQueue = Volley.newRequestQueue(context);
RequestQueue不需要再每次一的HTTP通信中新建,只需要在通信的activity中建立一个即可。
StringRequest使用,以百度首页为例:
StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("TAG", response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("TAG", error.getMessage(), error); } });
将stringRequest实例添加进mQueue中,mQueue.add(stringRequest )。 在onRespinse(String res
ponse) 这个回调方法中会返回http通信的结果,如果通信失败,则会返回onErrorResponse的回调。
采用同样的方法可以让其返回json格式、图片格式的数据。代码如下:
返回json数据:
protected void MyJsonObjectResult() { JsonObjectRequest mJsonObjectResult = new JsonObjectRequest(Request.Method.GET, url2, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // TODO Auto-generated method stub Log.d("TAG", response.toString());// <span style="font-family: Consolas, "Courier New", Courier, mono, serif; white-space: pre-wrap;">此处从onResonse 回调中可以获得指定url的json数据</span> } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub Log.e("TAG", error.getMessage(), error); } }); mQueue.add(mJsonObjectResult); }
<span style="white-space:pre"> </span>返回图片数据,这里使用了ImageLoader 和一个Volley中的自定义控件NetworkImageView。在这两种的使用中都支持图片缓存,这里通过自定义一个ImageCache接口来实现。
protected void MyImageLoaderResult() { ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache()); ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.defaultiamge, R.drawable.failed); imageLoader.get(url3, listener); } protected void MyNetworkImageViewResult() { ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache()); networkImageView.setDefaultImageResId(R.drawable.defaultiamge); networkImageView.setErrorImageResId(R.drawable.failed); networkImageView.setImageUrl(url3,imageLoader); } public class BitmapCache implements ImageCache { private LruCache<String, Bitmap> mCache; public BitmapCache() { int maxSize = 5 * 1024 * 1024;// 定义缓存大小5M mCache = new LruCache<String, Bitmap>(maxSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getRowBytes() * bitmap.getHeight(); } }; } @Override public Bitmap getBitmap(String url) { // TODO Auto-generated method stub return mCache.get(url); } @Override public void putBitmap(String url, Bitmap arg1) { // TODO Auto-generated method stub mCache.put(url, arg1); } }
除了以上的Volley提供的返回值之外,我们还可以自定义需求的返回数据类型。下面以返回一个XML
自定义类型的方式基本都是一样的,需要继承一个Request<T> ,这里因为是需要XML数据,所以选择了XmlPullParser按照String的方式来写就行。
protected void MyXmlResult() {
XmlRequest mXmlRequest = new XmlRequest(Request.Method.GET, url4, new Response.Listener<XmlPullParser>() {
@Override
public void onResponse(XmlPullParser response) {
// TODO Auto-generated method stub
try {
int eventType = response.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
String nodeName = response.getName();
if ("city".equals(nodeName)) {
Log.d("TAG", "pName is " + response.getAttributeValue(0));
}
break;
}
eventType = response.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
Log.e("TAG", error.getMessage(), error);
}
});
}
本文的例子在下载地址GIT: https://github.com/everyhappy/VolleyDemos/tree/VolleyDev