android 网络编程--Volley(一)

一、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
 
 
 
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值