一、简介:
Volley Github地址:https://github.com/mcxiaoke/android-volley
Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
Volley应该是简化了网络通信的一些开发,特别是针对以下两种情况:
二、简单使用:
(一)简单的GET请求,返回数据类型为String
1、记得添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
2、简单使用流程
private RequestQueue mRequestQueue;
//创建一个RequestQueue
mRequestQueue = Volley.newRequestQueue(this);
//创建一个StringRequest---GET请求
String url = "http://www.baidu.com";
StringRequest stringRequest = new StringRequest(url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, error.getMessage());
}
});
//将StringRequest对象添加到RequestQueue
mRequestQueue.add(stringRequest);
3、结果将会得到一串Html源码字符串
(二)简单的JSON GET请求,方法同上类似,这里使用另一个Request构造函数
String jsonurl = "http://pipes.yahooapis.com/pipes/pipe.run?_id=giWz8Vc33BG6rQEQo_NLYQ&_render=json";
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i(TAG, response.toString());
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i(TAG, error.getMessage());
}
};
JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET, jsonurl, null, listener, errorListener);
mRequestQueue.add(jr);
(三)简单的POST请求
JsonObjectRequest postRequest = new JsonObjectRequest(Request.Method.POST, jsonurl, null, listener, errorListener) {
//将Post的参数写入到map中
@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;
}
};
mRequestQueue.add(postRequest);
三、加载图片方法使用
(一)使用ImageRequest来实现,流程同上类似
String imageUrl = "http://a.hiphotos.baidu.com/image/pic/item/3801213fb80e7bec5cfb43e02d2eb9389b506b89.jpg";
int max_width = 300;
int max_height = 300;
Response.Listener<Bitmap> listener = new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
myImageView.setImageBitmap(response);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
myImageView.setImageResource(R.drawable.default_pg);
}
};
ImageRequest imageRequest = new ImageRequest(imageUrl, listener, max_width, max_height, Config.RGB_565, errorListener);
mRequestQueue.add(imageRequest);
其中,ImageRequest中的参数意义分别为:
* @param url URL of the image
* @param listener Listener to receive the decoded bitmap
* @param maxWidth Maximum width to decode this bitmap to, or zero for none
* @param maxHeight Maximum height to decode this bitmap to, or zero for
* none
* @param decodeConfig Format to decode the bitmap to
* @param errorListener Error listener, or null to ignore errors
注:1、maxWidth,maxHeight指最大的图片宽高,图片超过该尺寸则会进行压缩;若设为0,则不进行压缩直接加载;
2、decodeConfig指图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。
(二)使用ImageLoader来实现
ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。
//第一步创建RequestQueue,前面已经创建,这里不再重复创建
String imageUrl = "http://a.hiphotos.baidu.com/image/pic/item/3801213fb80e7bec5cfb43e02d2eb9389b506b89.jpg";
//创建LruCache保存下载过的图片
final LruCache<String, Bitmap> mImageLruCache = new LruCache<String, Bitmap>(20);
//创建ImageCache,供后面使用
ImageCache imageCache = new ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
mImageLruCache.put(url, bitmap);
}
@Override
public Bitmap getBitmap(String url) {
return mImageLruCache.get(url);
}
};
//创建ImageLoader
ImageLoader imageLoader = new ImageLoader(mRequestQueue, imageCache);
/**
* @param imageView The imageView that the listener is associated with.
* @param defaultImageResId Default image resource ID to use, or 0 if it doesn't exist.
* @param errorImageResId Error image resource ID to use, or 0 if it doesn't exist.
*/
//获取一个ImageListener对象
ImageListener imageListener = ImageLoader.getImageListener(myImageView, R.drawable.default_pg, R.drawable.failed_pg);
//调用ImageLoader的get()方法加载网络上的图片
imageLoader.get(imageUrl, imageListener);
//如果想对加载图片大小进行限定,使用get()的另一个重载方式
imageLoader.get(imageUrl, imageListener, 300, 300);
ImageLoader能够提供的一个比较好的实践就是能够提供图片缓存,这里通过LruCache来实现,最大缓存的图片数目为20张;我们也可以自定义最大缓存图片的内存大小,如下所示:
final LruCache<String, Bitmap> mImageLruCache = new LruCache<String, Bitmap>(maxSize){
@Override
protected int sizeOf(String url, Bitmap bitmap){
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
ImageCache imageCache = new ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
mImageLruCache.put(url, bitmap);
}
@Override
public Bitmap getBitmap(String url) {
return mImageLruCache.get(url);
}
};
这样创建了一个最大缓存大小为10M,策略为LRU的LruCache。
(三)使用NetworkImageView的方法
1、首先在XML布局中使用该控件
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/myNetworkImageView"
android:layout_width="300dp"
android:layout_height="300dp"
android:contentDescription="@string/hello_world"
/>
下载后的图片会根据width和height大小进行压缩,如果不想压缩图片,可以使用wrap content
2、然后代码中使用NetworkImageView
//前面创建ImageLoader与前面相同,不再重复创建
//使用NetworkImageView
NetworkImageView imageView = (NetworkImageView) findViewById(R.id.myNetworkImageView);
imageView.setDefaultImageResId(R.drawable.default_pg);
imageView.setErrorImageResId(R.drawable.failed_pg);
imageView.setImageUrl(imageUrl, imageLoader);