Volley 笔记


  郭大神的Volley解析

一,简介

android中的Http请求通常有两种,HttpURLConnectionHttpClient。

Volley是由Android开发团队开发的,在2016年的google I/O大会推出的网络通讯框架。他把AsyncHttp

Client和Universal-Image-Loader的有点集于一身,既可以像AsyncHttpClient一样进行网络通信,还可以像Universal-Image-Loader一样加载网络图片。适用于数据量不大,但通信频繁的网络操作,对于数据量较大的操作,比如下载文件,Volley表现的很差。


1,StringRequest

//创建对象
		RequestQueue queue=Volley.newRequestQueue(this);
quene是一个请求队列,他可以缓存所有的Http请求,然后按一定的算法并发的发送这些请求。所以我们不用每一次Http请求都创建一个RequestQueue对象,基本上在每个需要进行网络交互的Activity页面创建一个RequestQueue就行了。

//发送请求
		String url="http://www.baidu.com";
		Listener<String> listener=new Listener<String>() {

			@Override
			public void onResponse(String response) {
				Log.i(TAG, response);
				
			}
			
		};
		ErrorListener errorListener=new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError error) {
				Log.i(TAG, error.getMessage());
				
			}
		};
		StringRequest request=new StringRequest(Method.GET,url, listener, errorListener);
<pre name="code" class="java">//将请求添加到RequestQueen中
		queue.add(request);

 
如果是post方式的话,还需要提交参数,但是StringRequest没有设置参数的方法,但但是,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数方法

StringRequest request2=new StringRequest(Method.POST, url, listener, errorListener){
			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				HashMap<String , String > map=new HashMap<String, String>();
				map.put("params1", "values1");
				return map;
			}
		};
		queue.add(request2);

2,JsonRequest

JsonRequest是一个抽象类,我们一般使用的是他的两个子类 JsonObjectRequest和JsonArrayRequest,


		//发送请求
				String url="http://www.baidu.com";
				JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(url, null, new Listener<JSONObject>() {//第二个参数是请求参数

					@Override
					public void onResponse(JSONObject response) {
						Log.i(TAG, response.toString());
						
					}
					
				}, new ErrorListener() {

					@Override
					public void onErrorResponse(VolleyError error) {
						Log.e(TAG, error.getMessage());
						
					}
				}
		);
				queue.add(jsonObjectRequest);

3,ImageRequest

用法和之前的大同小异

RequestQueue queue=Volley.newRequestQueue(this);
		String url= "http://sc.admin5.com/uploads/allimg/100222/14153T363-0.jpg";
		//有点慢啊!
		ImageRequest request=new ImageRequest(url, new Listener<Bitmap>() {

			@Override
			public void onResponse(Bitmap response) {
				imageView.setImageBitmap(response);
				
			}
		}, 0, 0, Config.RGB_565, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError error) {
				imageView.setImageResource(R.drawable.ic_launcher);
				
			}
		});
		
		queue.add(request);
可以看到,ImageRequest的构造函数接收六个参数,第一个参数就是图片的URL地址,这个没什么需要解释的。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。 缺点是有点慢啊!

4,ImageLoader

Volley在请求网络图片方面可以做到的还远远不止这些,而ImageLoader就是一个很好的例子。ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求

		//创建ImageLoader
		ImageLoader imageLoader=new ImageLoader(queue, new ImageCache() {
			
			@Override
			public void putBitmap(String url, Bitmap bitmap) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public Bitmap getBitmap(String url) {
				// TODO Auto-generated method stub
				return null;
			}
		});
		//创建ImageListener
		ImageListener imageListener=imageLoader.getImageListener(imageView, R.drawable.ic_launcher, R.drawable.work_state_press);
		//调用ImageLoader的get()方法加载网络上的图片。
		imageLoader.get(url, imageListener);
	


这里没有为图片设置缓存,缓存最好使用LruCache

	class BitmapCache implements ImageCache{

	 private LruCache<String, Bitmap> mCache;  
	 
	 public BitmapCache() {  
	        int maxSize = 10 * 1024 * 1024;  
	        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 bitmap) {
			  mCache.put(url, bitmap);  
		}
		
	}

ImageLoader imageLoader=new ImageLoader(queue, new BitmapCache());
图片的缓存大小设置问10M。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值