使用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的方法。