您的位置:首页 > 理论基础 > 计算机网络

android 网络编程--Volley(一)

2016-10-10 23:15 169 查看

一、Volley 简介

Volley 为google 在2013年推出的网络通信框架。非常适合去进行数据量不大,但通信频繁的网络操作,如新闻页面的刷新。但是在下载等大数据量下的表现非常差。

二、Volley总览

在Volley中提供了常用的网络通信方式。如用于返回字符串的StringRequest,返回JSON的JsonRequest、
JsonObjectRequest,返回图片的ImageRequest。当然,我们也可以自己按照自己的需求来定义返回的类型。
在使用这些XXRequest之前,必须先新建一个RequestQueue。然后将这个XXRequest的实例添加进RequestQ
ueue中,就可以返回相应的值。
4000
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;// 定义缓存大小5MmCache = new LruCache<String, Bitmap>(maxSize) {@Overrideprotected int sizeOf(String key, Bitmap bitmap) {return bitmap.getRowBytes() * bitmap.getHeight();}};}@Overridepublic Bitmap getBitmap(String url) {// TODO Auto-generated method stubreturn mCache.get(url);}@Overridepublic void putBitmap(String url, Bitmap arg1) {// TODO Auto-generated method stubmCache.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>() {@Overridepublic void onResponse(XmlPullParser response) {// TODO Auto-generated method stubtry {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(){@Overridepublic void onErrorResponse(VolleyError error) {// TODO Auto-generated method stubLog.e("TAG", error.getMessage(), error);}});}
本文的例子在下载地址GIT: https://github.com/everyhappy/VolleyDemos/tree/VolleyDev

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息