Volley的使用笔记

刚刚看了郭霖大神的volley系列,只能深深的膜拜,膜拜完以后,我们还是老老实实的跟着大神的脚步来具体操练一下。volley是现在最流行的同网络频繁交互数据的开源工具,volley的特点是适合频繁的小量数据的交互,不适合大量数据的交互,在我看来,我们一般的App处理都是小量数据的交互。

Volley.jar文件下载地址

  掌握volley的用法,主要就是掌握以下几个对象的使用:

1.StringRequest.接受返回为String的数据;

2.jsonRequest.接受返回为Json的数据;

3.ImageLoader.接受返回为图片的数据.

1.StringRequest的用法

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mContext=this;
		//第一步,必须要获取到RequestQueue对象,一般一个Activity得到一个就够
		RequestQueue mQueue=Volley.newRequestQueue(mContext);</span>
		
		//第二步,由于我们要接受返回为string形式的数据,所以我们实例化一个StringRequest对象
		@SuppressWarnings("unchecked")
		StringRequest stringRequest=new StringRequest("http://www.baidu.com", new Response.Listener(){

			@Override
			public void onResponse(Object response) {
				// TODO Auto-generated method stub
				Log.e("wj", "response:"+response);
			}
			
		}, new Response.ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError error) {
				// TODO Auto-generated method stub
				Log.e("wj", "error:"+error);
			}
		});
		
	<span style="white-space:pre">	</span>//第三部,我们将StringRequest对象添加到RequestQueue里面
		mQueue.add(stringRequest);</span>
	}</span>


很明显,上面我是用get方式请求获取数据的,那么post请求如何使用呢,volley并没有提供设置post参数的方法,但是当发出post请求的时候,vollery会尝试调用Request中的getParams()方法,在这里设置post参数就可以了,因此我们需要重写Request里面的getParams()方法,代码如下:


StringRequest stringRequest=new StringRequest(Method.POST, url, listener, errorListener){

			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				Map<String ,String> map=new HashMap<String, String>();
				map.put("params1", "value1");
				map.put("params2", "value2");
				return map;
			}
			
		};</span>

2.jsonRequest的用法:

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mContext=this;
		
		tv=(TextView) findViewById(R.id.tv);
		
		final ProgressDialog progressDialog=ProgressDialog.show(mContext, "This is title", "loading");
		
		//第一步
		RequestQueue mQueue=Volley.newRequestQueue(mContext);
		//第二步
		@SuppressWarnings({ "unchecked", "rawtypes" })
		JsonObjectRequest jsonObjectRequest=new JsonObjectRequest("http://www.weather.com.cn/data/sk/101010100.html", null,
				new Response.Listener<JSONObject>() {
					@Override
					public void onResponse(JSONObject response) {
						// TODO Auto-generated method stub
						Log.e("wj", "response:"+response);
						String city=null;
						try {
							JSONObject jsonObject=(JSONObject) response.get("weatherinfo");
							city=(String) jsonObject.get("city");
						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						tv.setText(city);
						if(progressDialog.isShowing()&&progressDialog!=null){
							progressDialog.dismiss();
						}
					}
			
		}, new Response.ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError error) {
				// TODO Auto-generated method stub
				Log.e("wj", "error:"+error);
			}
		});
		//第三步
		mQueue.add(jsonObjectRequest);
		
	}</span>

这里jsonObjectRequest构造函数的第二个参数作用是:如果是null说明我们用的是get请求,如果不为null说明我们用的是post请求。OK,这里我还加入了一个progressdialog,让我们的程序更实用,同时我对返回的json稍微解析了一下,把城市的名字放在了我们配置文件中的TextView中。

接下来就是我们最头疼,也是最美的图片部分了............................................

3.ImageRequest

必须先上一张图,看到结果我们才有动力

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mContext=this;
		
		iv_g=(ImageView) findViewById(R.id.iv);
		
		final ProgressDialog dialog=ProgressDialog.show(mContext, null, "Loading...");
		
		RequestQueue mQueue=Volley.newRequestQueue(mContext);
		
		ImageRequest imageRequest=new ImageRequest("http://t10.baidu.com/it/u=4189675059,3919880875&fm=59", new Listener<Bitmap>() {

			@Override
			public void onResponse(Bitmap response) {
				// TODO Auto-generated method stub
				iv_g.setImageBitmap(response);
				if(dialog.isShowing()&&dialog!=null){
					dialog.dismiss();
				}
			}
		}, 0, 0, Config.RGB_565, new ErrorListener() {

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

接下来我们将volley对图片操作的更好用的一个工具ImageLoader。由于ImageLoader已经不是继承自Request了,所以它的用法也和我们之前学到的内容有所不同,总结起来大致可分为以下四步:

1.创建一个RequestQueue对象。

2.创建一个ImageLoader对象。

3.获取一个ImageListener对象。

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

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mContext=this;
		
		iv_g=(ImageView) findViewById(R.id.iv);
		
		//1创建一个RequestQueue对象
		RequestQueue mQueue=Volley.newRequestQueue(mContext);
		
		//2.创建一个ImageLoader对象
		ImageLoader imageLoader=new ImageLoader(mQueue,</span><span style="color:#ff0000;">new ImageCache()</span><span style="color:#333333;"> {
			
			@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;
			}
		});
		//3.获取一个ImageListener对象(绑定需要监听的ImageView控件)
		ImageListener imageListener=ImageLoader.getImageListener(iv_g, 
										R.drawable.ic_launcher, R.drawable.ic_launcher);
		//4.调用imageLoader的get(url,listener)方法
		imageLoader.get("http://t10.baidu.com/it/u=4189675059,3919880875&fm=59", imageListener,200,200);
	}</span></span>
get方法有两个构造函数,大家都试试,后边带两个大小的是限制图片的大小。这里有人会感到疑惑ImageCache是个干什么用的,我们知道在图片加载的时候我们往往会对其进行缓存,包括一级缓存和二级缓存,ImageCache就是vollery专门给我们放出来,让我选择性的实现自己的缓存需求。所以我们往往会重写此方法,同样用LruCache功能对图片进行缓存(LruCache是最好用的内从缓存)

这里我们新建一个BitmapCache并实现ImageCache接口,代码如下:

class BitmapCache implements ImageCache{

		private LruCache<String, Bitmap> lruCache;
		
		public BitmapCache() {
			//得到此程序运行时系统分配的内存,然后用它的十分之1作为我们分配给图片的内存缓存空间
			int maxSize=(int) (Runtime.getRuntime().maxMemory()/10);
			Log.e("wj", maxSize+"");
			
			lruCache=new LruCache<String, Bitmap>(maxSize){

				@Override
				protected int sizeOf(String key, Bitmap value) {
					// TODO Auto-generated method stub
					return value.getRowBytes()*value.getHeight();
				}
			};
		}
		
		@Override
		public Bitmap getBitmap(String url) {
			// TODO Auto-generated method stub
			return lruCache.get(url);
		}

		@Override
		public void putBitmap(String url, Bitmap bitmap) {
			// TODO Auto-generated method stub
			lruCache.put(url, bitmap);
		}
		
	}</span>
那么我们就可以简化上面那个代码了
//2.创建一个ImageLoader对象
	ImageLoader imageLoader=new ImageLoader(mQueue,new BitmapCache());</span>


同时大家有没有看到,上面缓存的时候我用了运行时系统分配的内存大小,下面:


12-10 08:31:37.171: E/wj(1227): </span><span style="color:#ff0000;"><span style="color:#ff0000;">3355443</span></span></span>


最后一个控件,NetworkImageView。我认为是最实用 的一个控件,同样是vollery提供用来加载网络图片的,我们往往在项目中会有很多图片,我们不可能对每一个图片都像上面那样详细的处理,所以我们更多的会用到这个控件,下面我来看看具体的用法:

1.创建一个RequestQueue对象

2.创建一个ImageLoader对象

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

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

5.设置要加载图片地址

配置文件.xml

<com.android.volley.toolbox.NetworkImageView
        android:id="@+id/netIV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="Beautiful Gao yuan yuan "/></span>
Activity中
package com.wj.volley;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.util.LruCache;
import android.util.Log;


public class MainActivity extends Activity {

	private Context mContext;
	
	private NetworkImageView iv_g;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mContext=this;
		//4.在代码中获得该控件
		iv_g=(NetworkImageView) findViewById(R.id.netIV);
		
		//1创建一个RequestQueue对象
		RequestQueue mQueue=Volley.newRequestQueue(mContext);
		
		//2.创建一个ImageLoader对象
		ImageLoader imageLoader=new ImageLoader(mQueue,new BitmapCache());
		//5.设置要加载的图片路径
		iv_g.setImageUrl("http://t10.baidu.com/it/u=4189675059,3919880875&fm=59", imageLoader);
	}
	
	class BitmapCache implements ImageCache{

		private LruCache<String, Bitmap> lruCache;
		
		public BitmapCache() {
			//得到此程序运行时系统分配的内存,然后用它的十分之1作为我们分配给图片的内存缓存空间
			int maxSize=(int) (Runtime.getRuntime().maxMemory()/10);
			Log.e("wj", maxSize+"");
			
			lruCache=new LruCache<String, Bitmap>(maxSize){

				@Override
				protected int sizeOf(String key, Bitmap value) {
					// TODO Auto-generated method stub
					return value.getRowBytes()*value.getHeight();
				}
			};
		}
		
		@Override
		public Bitmap getBitmap(String url) {
			// TODO Auto-generated method stub
			return lruCache.get(url);
		}

		@Override
		public void putBitmap(String url, Bitmap bitmap) {
			// TODO Auto-generated method stub
			lruCache.put(url, bitmap);
		}
		
	}
}
</span>

OK  基本知识都操练一遍,具体遇到问题留待以后项目中再来补充吧 。要动手啊................

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值