Volley的基本使用(2)——加载图片

使用Volley加载网络上的图片有3中实现方式:

1.直接使用ImageRequest来加载图片,这个虽然加载图片也是比较快速的,但是没有缓存功能,如果需要重复再网络上看同一张图片的话是很不划算的,因为每一次加载都是很浪费流量的;

2.使用ImageLoader+ImageView来实现加载图片,加入了缓存功能,不过需要自己实现缓存类ImageCache的实现类;

3.使用ImageLoader+NetworkImageView,加入了缓存功能,也需要自己实现缓存类ImageCache的实现类。


下面来介绍一下三种方法的使用:

1.类似于Volley的StringRequest,JSonObjectRequest等网络请求,我们需要创建一个请求队列,这里我新建了一个类MyApplication集成Application,初始化队列,代码如下:

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

import android.app.Application;

public class MyApplication extends Application {
	public static RequestQueue queues;
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		queues = Volley.newRequestQueue(getApplicationContext());
	}

	public static RequestQueue getHttpQueues() {
		return queues;
	}
}
同时,在AndroidManifest.xml中加入:

<application
        android:name="com.raid.volleydemo.MyApplication"/>


2.接下来就可以使用三种方法加载图片了:


第一种方法:

/**
	 * 使用ImageRequest加载网络上的图片
	 * @param url 加载图片的地址
	 */
	private void useImageView(String url) {
		
		ImageRequest request = new ImageRequest(url, new Listener<Bitmap>() {

			@Override
			public void onResponse(Bitmap arg0) {
				// TODO Auto-generated method stub
				iv.setImageBitmap(arg0);
			}
		}, 0, 0, Config.RGB_565, new Response.ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				// TODO Auto-generated method stub
				iv.setImageResource(R.drawable.ic_launcher);
			}
		});
		//加入请求队列
		MyApplication.getHttpQueues().add(request);
	}

这里参数的解释我看了一个大神的博客写的非常的详细,所以就直接贴出了这个博客的内容:

可以看到,ImageRequest的构造函数接收六个参数,第一个参数就是图片的URL地址,这个没什么需要解释的。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。

博客的地址是:http://blog.csdn.net/ysh06201418/article/details/46443235


第二种方法:

/**
     * 使用ImageLoader+ImageView实现
     * @param url url 加载图片的地址
     */
    private void useImageLoader(String url) {
        // 创建ImageLoader对象
        ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(),
                new BitmapCache());
        /**
         * iv是ImageView
         * getImageListener的第一个参数是需要显示在哪个ImageView上
         * 第二个参数是默认显示的图片
         * 第三个参数是加载失败的时候显示的图片
         */
        ImageListener listener = ImageLoader.getImageListener(iv, R.drawable.ic_launcher, R.drawable.ic_launcher);
        //把加载类和加载地址和加载监听器联系起来,加载图片
        loader.get(url, listener);
    }

这里的BitmapCache类就是实现了图片的缓存功能:

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

public class BitmapCache implements ImageCache {
    //图片缓存类
    public LruCache<String, Bitmap> cache;
    //自定义缓存的最大空间是10M
    public int max = 10*1024*1024;
    
    public BitmapCache() {
        //初始化缓存类对象
        cache = new LruCache<String, Bitmap>(max){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                // 返回指定图片的大小
                return value.getRowBytes()*value.getHeight();
            }
        };
    }

    /*
     * 从缓存中取出图片
     * @see com.android.volley.toolbox.ImageLoader.ImageCache#getBitmap(java.lang.String)
     */
    @Override
    public Bitmap getBitmap(String arg0) {
        // TODO Auto-generated method stub
        return cache.get(arg0);
    }

    /*
     * 把图片加入缓存中
     * @see com.android.volley.toolbox.ImageLoader.ImageCache#putBitmap(java.lang.String, android.graphics.Bitmap)
     */
    @Override
    public void putBitmap(String arg0, Bitmap arg1) {
        // TODO Auto-generated method stub
        cache.put(arg0, arg1);
    }

}

第三种方法:

/**
	 * 使用ImageLoader + NetworkImageView实现功能
	 * @param url 加载图片的地址
	 */
	private void useNetworkImageLoader(String url) {
		// 创建ImageLoader对象
		ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(),
				new BitmapCache());
		//netIv是NetworkImageView对象。设置默认显示的图片
		netIv.setDefaultImageResId(R.drawable.ic_launcher);
		//设置加载失败时显示的图片
		netIv.setErrorImageResId(R.drawable.ic_launcher);
		//把地址和加载类联系起来,加载图片
		netIv.setImageUrl(url, loader);
	}

运行测试上面3中方法后,我发现第三种方法加载的速度没有第一种和第二种快,所以建议的是使用第二种方法实现图片的加载,也就是ImageLoader+ImageView的方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值