一,简介:
android中的Http请求通常有两种,HttpURLConnection和HttpClient。
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);
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。