我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。
不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。
Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
get请求
private voidget(){
RequestQueue rq= Volley.newRequestQueue(getApplicationContext());
StringRequest有三个参数 一个是请求地址 一个是强求成功调用的方法,一个是请求失败调用的方法
StringRequest sr=new StringRequest(url, newResponse.Listener() {
@Override
public voidonResponse(String s) { textView.setText(s.toString()); }
}, newResponse.ErrorListener() {
@Override
public voidonErrorResponse(VolleyError volleyError) {}
});
rq.add(sr);
}
POST方法
RequestQueue rq= Volley.newRequestQueue(getApplicationContext());
StringRequest stringRequest =newStringRequest(Request.Method.POST,url, newResponse.Listener() {
@Override
public voidonResponse(String s) {
}
}, newResponse.ErrorListener() {
@Override
public voidonErrorResponse(VolleyError volleyError) {
}
}) {
@Override
protectedMapgetParams()throwsAuthFailureError {
Map map =newHashMap();
map.put("参数1","value1");
map.put("参数2","value2");
returnmap;
}
};
rq.add(stringRequest);
}
用Volley加载图片,使用这么一个方法
private voidimage(){
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
ImageRequest imageRequest =newImageRequest(
"http://img02.tooopen.com/images/20141231/sy_78327074576.jpg",
newResponse.Listener() {
@Override
public voidonResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
},0,0,Bitmap.Config.ARGB_8888, newResponse.ErrorListener() {
@Override
public voidonErrorResponse(VolleyError error) {
imageView.setImageResource(R.mipmap.ic_launcher);
}
});
mQueue.add(imageRequest);
}
可以看到,ImageRequest的构造函数接收六个参数,第一个参数就是图片的URL地址,这个没什么需要解释的。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,这里可以设置为null,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。
加载网络图片并缓存
写一个ImageCache起到图片缓存的作用
public classBitmapCacheimplementsImageLoader.ImageCache {
privateLruCachemCache;
publicBitmapCache() {
intmaxSize =10*1024*1024; //这个是缓存大小 10M
mCache=newLruCache(maxSize) {
@Override
protected intsizeOf(String key,Bitmap bitmap) {
returnbitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@Override
publicBitmapgetBitmap(String url) {
returnmCache.get(url);
}
@Override
public voidputBitmap(String url,Bitmap bitmap) {
mCache.put(url,bitmap);
}
}
这样我们就可以用这个类进行缓存图片 接下来进行缓存
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
ImageLoader imageLoader =newImageLoader(mQueue, newBitmapCache());
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,
R.mipmap.ic_launcher,R.mipmap.ic_launcher_round);
imageLoader.get("http://img02.tooopen.com/images/20141231/sy_78327074576.jpg",listener);
//imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",listener, 200, 200);
网友评论