Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
由于Volley是要访问网络的,因此不要忘记在你的AndroidManifest.xml中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
// 一个Activity创建一个RequestQueue实例
RequestQueue mQueue = Volley.newRequestQueue(context);
// 默认请求方式为GET,Listener,ErrorListener是请求结果的监听接口,是在UI线程中运行的
StringRequest stringRequest = new StringRequest("http://www.baidu.com",
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(), error);
}
});
// 添加到请求队列中等待执行
mQueue.add(stringRequest);
// 这里添加Method.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;
}
};
mQueue.add(stringRequest);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("TAG", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mQueue.add(jsonObjectRequest);
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest("http://m.weather.com.cn/data/101010100.html", null,
new Response.Listener<JsonArray>() {
@Override
public void onResponse(JsonArray response) {
Log.d("TAG", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mQueue.add(jsonArrayRequest);
ImageRequest imageRequest = new ImageRequest(
"http://developer.android.com/images/home/aw_dac.png",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.CENTER_INSIDE, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
imageView.setImageResource(R.drawable.default_image);
}
});
mQueue.add(imageRequest);
小结一下,上面已经已经列出Volley为我们封装好常用的4种请求,使用过程可总结为: 初始化RequestQueue -> 创建Request -> 添加到RequestQueue
// 初始化ImageLoader,第一个参数为RequestQueue,第二个参数为图片缓存接口
ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
@Override
public Bitmap getBitmap(String url) {
return null;
}
});
// 根据imageview获取ImageListener,参数分别为ImageView,默认展示的图片,请求失败展示的图片
ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.default_image, R.drawable.failed_image);
// 通过imageloader加载图片
//imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener);
// 通过imageloader加载图片,参数分别为图片url,该图片的监听接口,图片的宽度,高度
imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener, 200, 200);
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
// 缓存最大内存为10MB
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);
}
}
说白了ImageLoader是对ImageRequest的封装,这里总结一下使用过程: 创建RequestQueue -> 创建ImageLoader -> 获取ImageListener -> 通过ImageLoader的get()开始加载图片
<!-- NetworkImageView 控件 -->
<com.android.volley.toolbox.NetworkImageView android:id="@+id/network_image_view" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center_horizontal" />
networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
ImageLoader ImageLoader = ...;
// 设置NetworkImageView 图片资源
networkImageView.setDefaultImageResId(R.drawable.default_image);
networkImageView.setErrorImageResId(R.drawable.failed_image);
networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",
imageLoader);
可以看出NetworkImageView其实是对ImageView跟ImageLoader的封装,这样的封装真的需要慢慢体会理解,这里mark一下,哈哈,没事可以看看
这里图片的宽高是根据控件的宽高获取,如果把NetworkImageView的layout_width和layout_height都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩。
光是用法来说,Volley确实是值得学习学习,这里总结一下NetworkImageView的使用过程:创建RequestQueue -> 在布局中定义NetworkImageView并获取控件 -> 创建一个ImageLoader -> 设置NetworkImageView要加载图片的url(还可以设置setErrorImageResId和setDefaultImageResId)
现在已经写了关系Volley源码分析的相关文章,有兴趣的博友可以去看看Volley – 源码分析 和Volley – 图片处理方式源码分析
接下来还写了一篇关于Volley的源码分析,分析有Volley请求的流程,缓存的策略,工作线程的执行分配,接口回调的机制,代码的封装等