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

来源:互联网 发布:mac webpack 编辑:程序博客网 时间:2024/05/17 17:16

使用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;@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.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>() {@Overridepublic void onResponse(Bitmap arg0) {// TODO Auto-generated method stubiv.setImageBitmap(arg0);}}, 0, 0, Config.RGB_565, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError arg0) {// TODO Auto-generated method stubiv.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的方法。

0 0
原创粉丝点击