您的位置:首页 > 其它

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

2015-12-15 15:51 471 查看
使用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的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: