Android Volley基本使用

来源:互联网 发布:美工注意事项 编辑:程序博客网 时间:2024/06/05 17:40

Android开发过程中离不开与网络打交道,多数情况是使用HTTP协议发送和接收网络数据,Android系统主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient(android Studio不支持),不过由于HTTP请求经常使用,为了方便和代码的简化,Android网络通信的框架应运而生。例如以前的Async-http-Client、Universal-Image_Loader、XUtils等等。

后来2013年Google团队推出了一个新的网络框架Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。

Volley的特点:
  • 适用于频繁请求而每次请求数据量不会很大;
  • 在请求的基础上做了磁盘缓存;
  • 防止多次相同请求浪费资源;
  • 提供String、Json、图片异步下载;
  • 网络请求的优先级处理;
  • 图片请求无需担心生命周期问题。
简单的使用过程:

导入包:

定义一个RequestQueue:

RequestQueue mQueue= Volley.newRequestQueue(context);
1、StringRequest

定义一个StringRequest:

StringRequest stringRequest= new StringRequest("http://www.baidu.com", new Response.Listener<String>() {    @Override    public void onResponse(String s) {        Log.i("Tag",s);        getElementById(s);    }}, new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError volleyError) {        Log.i("Tag",volleyError.getMessage(),volleyError);    }});

将StringRequest添加到mQueue中:

mQueue.add(stringRequest);


运行之后Log日志中能看到打印信息:

2、JsonRequest

返回的数据如下图:
得到数据之后自己做Json解析即可。

3、Post方式的请求

HTTP的请求类型通常有两种,GET和POST,刚才我们使用的明显是一个GET请求,那么如果想要发出一条POST请求应该怎么做呢?
StringRequest中还提供了另外一种四个参数的构造函数,其中第一个参数就是指定请求类型的,我们可以使用如下方式进行指定:
  1. StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener);  
这就指定了HTTP的请求方式为POST,提交给服务器的参数的设置(tringRequest中并没有提供设置POST参数的方法),当发出POST请求的时候,
Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,我们只需要在
StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了,代码如下所示:
  1. StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {  
  2.     @Override  
  3.     protected Map<String, String> getParams() throws AuthFailureError {  
  4.         Map<String, String> map = new HashMap<String, String>();  
  5.         map.put("params1""value1");  
  6.         map.put("params2""value2");  
  7.         return map;  
  8.     }  
  9. };  

4、ImageReQuest:图片请求

编写点击事件:
public void click(View view){    RequestQueue mQueue=Volley.newRequestQueue(MainActivity.this);    ImageRequest imageRequest= new ImageRequest("http://d.hiphotos.baidu.com/image/pic/item/562c11dfa9ec8a13f075f10cf303918fa1ecc0eb.jpg",            new Response.Listener<Bitmap>() {                @Override                public void onResponse(Bitmap bitmap) {                    im_map.setImageBitmap(bitmap);                }            },0, 0, Bitmap.Config.ALPHA_8, new Response.ErrorListener() {        @Override        public void onErrorResponse(VolleyError volleyError) {                    im_map.setImageResource(R.drawable.nzywt);        }    });    mQueue.add(imageRequest);}
将下载的百度图片显示到ImageView中:
ImageRequest的构造函数接受6个参数,1、图片URL地址;2、图片请求成功的回调;3、图片显示最大宽度;4、图片的显示
最大高度;5、图片的颜色属性(Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4
个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小);6、图片请求失败的回调,这里请求失败的时候是显示Drawable下面的
nzywt.jpg图片。

5、ImageLoader:

mageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加
高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

由于ImageLoader已经不是继承自Request的,所以它的用法也和我们之前学到的内容有所不同,总结起来大致可以分为以下四步:

1. 创建一个RequestQueue对象。

2. 创建一个ImageLoader对象。

3. 获取一个ImageListener对象。

4. 调用ImageLoader的get()方法加载网络上的图片

public void click(View view){    RequestQueue mQueue=Volley.newRequestQueue(MainActivity.this);    String s="http://d.hiphotos.baidu.com/image/pic/item/562c11dfa9ec8a13f075f10cf303918fa1ecc0eb.jpg";
//ImageLoader的构造函数接收两个参数,第一个参数就是RequestQueue对象,第二个参数是一个ImageCache对象,
这里我们先new出一个空的ImageCache的实现即可。    ImageLoader imageLoader= new ImageLoader(mQueue, new ImageLoader.ImageCache() {        @Override        public Bitmap getBitmap(String s) {            return null;        }        @Override        public void putBitmap(String s, Bitmap bitmap) {        }    });
//参数一为ImageView容器,参数二为加载过程中显示的图片,参数三为加载出错显示的图片    ImageLoader.ImageListener listener=ImageLoader.getImageListener(im_map,R.drawable.nzywt,
R.drawable.error);
    imageLoader.get(s,listener);//重载的get()方法可以指定加载的宽和高}

加载过程中的图片 加载完成的图片

ImageLoader的图片缓存功能
写一个ImageCache也非常简单,想要写一个性能非常好的ImageCache,最好就要借助Android提供的LruCache功能了。

  1. public class BitmapCache implements ImageCache {  
  2.   
  3.     private LruCache<String, Bitmap> mCache;  
  4.   
  5.     public BitmapCache() {  
  6.         int maxSize = 10 * 1024 * 1024;  
  7.         mCache = new LruCache<String, Bitmap>(maxSize) {  
  8.             @Override  
  9.             protected int sizeOf(String key, Bitmap bitmap) {  
  10.                 return bitmap.getRowBytes() * bitmap.getHeight();  
  11.             }  
  12.         };  
  13.     }  
  14.   
  15.     @Override  
  16.     public Bitmap getBitmap(String url) {  
  17.         return mCache.get(url);  
  18.     }  
  19.   
  20.     @Override  
  21.     public void putBitmap(String url, Bitmap bitmap) {  
  22.         mCache.put(url, bitmap);  
  23.     }  
  24.   
  25. }  
这里我们将缓存图片的大小设置为10M。接着修改创建ImageLoader实例的代码,第二个参数传入BitmapCache的实例
  1. ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());  
6、NetworkImageView
Volley提供的第三种加载网络图片的方式,

不同于以上两种方式,NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上

加入了加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单,大致可以分为以下五步:

1. 创建一个RequestQueue对象。

2. 创建一个ImageLoader对象。

3. 在布局文件中添加一个NetworkImageView控件。

4. 在代码中获取该控件的实例。

5. 设置要加载的图片地址。


Activity中:
netImageView= (NetworkImageView) findViewById(R.id.netImageView);
public void click(View view){    RequestQueue mQueue=Volley.newRequestQueue(MainActivity.this);    String s="http://d.hiphotos.baidu.com/image/pic/item/562c11dfa9ec8a13f075f10cf303918fa1ecc0eb.jpg";    ImageLoader imageLoader= new ImageLoader(mQueue, new ImageLoader.ImageCache() {        @Override        public Bitmap getBitmap(String s) {            return null;        }        @Override        public void putBitmap(String s, Bitmap bitmap) {        }    });    netImageView.setDefaultImageResId(R.drawable.nzywt);    netImageView.setErrorImageResId(R.drawable.error);    netImageView.setImageUrl(s,imageLoader);
}
显示的效果一样,不上图了。

基本用法大概就这些了,边看边学边写,谢谢网上的参考资料,很多很精细。奋斗奋斗
谢谢:
http://blog.csdn.net/guolin_blog/article/details/17482165

0 0
原创粉丝点击