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中还提供了另外一种四个参数的构造函数,其中第一个参数就是指定请求类型的,我们可以使用如下方式进行指定:
- StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);
这就指定了HTTP的请求方式为POST,提交给服务器的参数的设置(tringRequest中并没有提供设置POST参数的方法),当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了,代码如下所示::
- 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;
- }
- };
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功能了。
这里我们将缓存图片的大小设置为10M。接着修改创建ImageLoader实例的代码,第二个参数传入BitmapCache的实例
- public 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) {
- return mCache.get(url);
- }
- @Override
- public void putBitmap(String url, Bitmap bitmap) {
- mCache.put(url, bitmap);
- }
- }
6、NetworkImageView
- ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
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);}显示的效果一样,不上图了。
基本用法大概就这些了,边看边学边写,谢谢网上的参考资料,很多很精细。谢谢: