在上一篇的学习分享中简介了Volley框架并代码示例初步使用Volley实现一个HTTP请求,那么这一篇学习分享中我们将更深入一步,重点学习如何高效加载网络图片,主要内容为ImageRequest、ImageLoader、
ImageLoader+NetworkImageView这三种基于Volley的网络图片加载方式的用法及总结。如果你对Volley框架及其应用还不太熟悉,非常推荐阅读我的上一篇学习分享——安卓通信框架Volley学习(一)Volley简介和初步使用。
1、ImageRequest
一看到ImageRequest类很容易就联想到上一节中使用的StringRequest类,它们都是继承自Request父类,因此两者用法是相似的。即通过以下三个步骤完成一次HTTP请求:
a、获取当前context下的RequestQueue请求队列对象
b、实例化一个Request对象
c、添加Request对象到RequestQueue请求队列中
代码参考如下:
<span style="font-size: 18px;"> </span><span style="font-size:14px;">RequestQueue myQueue = Volley.newRequestQueue(getApplicationContext());
/*
* 实例化ImageRequest对象
* 参数一:图片文件路径
* 参数二:请求成功回调函数
* 参数三和参数四:允许图片最大的宽度和高度,如果获取的图片大小超过这里指定的值将对
* 图片压缩,如果设置为0,0则不会限制获取图片大小
* 参数五:指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888
* 可以展示最好的颜色属性,每个图片像素占据4个字节的大小。
* 参数六:请求失败的回调函数
*/
ImageRequest imageRequest = new ImageRequest("http://avatar.csdn.net/8/8/8/1_jerrycqu.jpg",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap arg0) {
// TODO Auto-generated method stub
img1.setImageBitmap(arg0);
}
}, 0, 0, Config.ARGB_8888,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
// TODO Auto-generated method stub
img1.setImageResource(R.drawable.error);
}
});
//添加请求对象到请求队列中
myQueue.add(imageRequest);</span>
2、ImageLoader
ImageLoader是基于ImageRequest来实现的,不过要更加高效。ImageLoader类提供了缓存图片的功能,避免了程序对相同图片资源的多次请求,也更加的适合多图片加载,比如在ListView中展示网络图片。当然ImageLoader的用法和继承自Request类的ImageRequest的用法是有区别的,具体可分为以下四步:
a.创建一个RequestQueue对象
b.创建一个ImageLoader对象
c.获取一个ImageListener对象
d.调用ImageLoader的get()方法加载网络上的图片
代码示例:
RequestQueue myQueue = Volley.newRequestQueue(getApplicationContext());
/*
* 实例化一个ImageLoader对象
* 参数一:线程队列RequestQueue对象
* 参数二:缓存图片的imageCache对象,这里自定义的BitmapCache继承LruCache内存缓存对象
* 实现了ImageCache接口,确定缓存大小10M
*/
ImageLoader imageLoader = new ImageLoader(myQueue, new BitmapCache(10*1024*1024));
/*
* 实例化一个ImageListener对象,图片请求回调
* 参数一:指定用于显示获取的网络图片的ImageView控件
* 参数二:指定加载图片的过程中显示的默认图片
* 参数三:指定加载图片失败的情况下显示的图片
*/
ImageListener imageListener = ImageLoader.getImageListener(img2, R.drawable.img1, R.drawable.error);
/*
* 调用ImageLoader的get()方法来加载图片
* 参数一:图片的URL地址
* 参数二:前面实例化的ImageListener对象
* 参数三和参数四:允许图片最大的宽度和高度,如果获取的图片大小超过这里指定的值将对
* 图片压缩,如果设置为0,0则不会限制获取图片大小(非必须)
*/
imageLoader.get("http://avatar.csdn.net/8/8/8/1_jerrycqu.jpg", imageListener, 0, 0);
BitmapCache类代码:
/*
* BitmapCache类继承自LruCache内存缓存对象,实现了ImageCache接口
*/
public class BitmapCache extends LruCache<String, Bitmap> implements ImageCache{
//构造方法,初始化BitmapCache对象,分配缓存大小
public BitmapCache(int maxSize) {
super(maxSize);
// TODO Auto-generated constructor stub
}
@Override
protected int sizeOf(String key, Bitmap value) {
// TODO Auto-generated method stub
return value.getRowBytes() * value.getHeight();
}
@Override
public Bitmap getBitmap(String arg0) {
// TODO Auto-generated method stub
return get(arg0);
}
@Override
public void putBitmap(String arg0, Bitmap arg1) {
// TODO Auto-generated method stub
put(arg0, arg1);
}
}
3、ImageLoader+NetworkImageView
NetworkImageView对象是一个自定义控件,继承自ImageView扩展了加载网络图片的功能。使用ImageLoader+NetworkImageView的方式加载网络图片将更加的高效和简单,最重要的是使用NetworkImageView可以解决ListView加载图片出现的由于获取网络图片延迟导致的加载乱序的问题(这个将在后面继续学习),实现流程为以下五步:
a、布局文件中添加NetworkImageView控件
b、实例化一个RequestQueue对象
c、实例化一个ImageLoader对象
d、代码中获取布局文件中的NetworkImageView控件对象
e、设置要加载的图片地址
代码示例:
RequestQueue myQueue = Volley.newRequestQueue(getApplicationContext());
/*
* 实例化一个ImageLoader对象
* 参数一:线程队列RequestQueue对象
* 参数二:缓存图片的imageCache对象,这里自定义的BitmapCache继承LruCache内存缓存对象
* 实现了ImageCache接口,确定缓存大小10M
*/
ImageLoader imageLoader = new ImageLoader(myQueue, new BitmapCache(10*1024*1024));
img3 = (NetworkImageView) findViewById(R.id.networkImageView);
img3.setDefaultImageResId(R.drawable.img1);
img3.setErrorImageResId(R.drawable.error);
img3.setImageUrl("http://avatar.csdn.net/8/8/8/1_jerrycqu.jpg", imageLoader);
Xml布局文件代码:
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/networkImageView"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_gravity="center_horizontal" />