安卓网络通信框架Volley学习(二)基于Volley高效加载网络图片

在上一篇的学习分享中简介了Volley框架并代码示例初步使用Volley实现一个HTTP请求,那么这一篇学习分享中我们将更深入一步,重点学习如何高效加载网络图片,主要内容为ImageRequestImageLoader

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.调用ImageLoaderget()方法加载网络上的图片

代码示例:

    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" />


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值