StringRequest和JsonRequest都是继承Request的,ImageRequest也是继承Request的,因此他们的用法基本相同,也是按照以下三步进行操作:
1.创建一个RequestQueue对象
2.创建Request对象
3.将Request对象添加到RequestQueue队列里
private void Vollry_GetImage() {
//第一个参数:图片Url
//第二个参数:成功回调,Bitmap类型
/*
第三、第四个参数:指定允许图片最大的宽度和高度
如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,
如果指定成0的话就表示不管图片有多大,都不会进行压缩。
*/
/*
第五个参数用于指定图片的颜色属性
Bitmap.Config下的几个常量都可以在这里使用,
ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,
RGB_565则表示每个图片像素占据2个字节大小。
*/
//第六个参数:出错回调,显示提示图片
String imgUrl = "http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg";
ImageRequest imageRequest = new ImageRequest(
imgUrl,
new Response.Listener() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
},
0,
0,
Bitmap.Config.RGB_565,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
imageView.setImageResource(R.mipmap.ic_launcher);
}
});
MyApplication.getHttpQueues().add(imageRequest);
}
ImageLoader也可以用于加载网络图片,它的内部是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。由于ImageLoader不是继承自Request的,所以它的用法也和之前的内容有所不同,大致可以分为四步:
1.创建RequestQueue对象
2.创建ImageLoder对象
3.获取ImageListener对象
4.调用ImageLoder的get方法加载网络图片
private void Vollry_GetImageLoader() {
String imgUrl = "http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg";
//可以对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求.
//第一个参数:RequestQueue对象
//第二个参数:ImageCache对象
ImageLoader imageLoader = new ImageLoader(
MyApplication.getHttpQueues(),
new BitmapCache()
);
// 第一个参数:用于显示图片的ImageView控件,
// 第二个参数:加载图片过程显示的图片,
// 第三个参数:加载图片失败显示的图片。
ImageLoader.ImageListener listener = ImageLoader.getImageListener(
imageView,
R.mipmap.ic_launcher,
R.mipmap.ic_launcher
);
//第一个参数:图片的URL地址,
//第二个参数:获取到的ImageListener对象listener。
//第三个、四个参数是图片的最大宽度、高度
//imageLoader.get(imgUrl, listener);
imageLoader.get(imgUrl, listener, 500, 350);
}
这里我们新建一个BitmapCache并实现了ImageCache接口来缓存图片,用到了Android提供的LruCache功能
/*
* Lru即Least Recently Used近期最少使用算法
* LruCache是基于Lru算法实现的一种缓存机制
* Lru算法原理是当内存缓存数据大于设定的最大值时,把近期最少使用的数据移除,有效避免OOM。
* LruCache没有真正是释放内存,知识从Map中移除数据,真正释放内存还要用户手动释放
*
* */
public class BitmapCache implements ImageLoader.ImageCache {
final int memoryCache = MyApplication.getMemoryCacheSize();
//Url,图片
private LruCache myCache;
public BitmapCache() {
//通过构造方法初始化缓存最大值,KB为单位
myCache = new LruCache(memoryCache) {
//重写sizeOf方法衡量每张图片大小,默认返回的是图片数量
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
};
}
@Override
public Bitmap getBitmap(String s) {
return myCache.get(s);
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
myCache.put(s, bitmap);
}
}
这里,final int memoryCache = MyApplication.getMemoryCacheSize();在MyApplication类添加了下面方法:
public static int getMemoryCacheSize() {
//为了全局调用,在Application类中定义了cache大小的方法,官方建议取当前app可用内存的1/8。
final int memClass = (int) (Runtime.getRuntime().maxMemory())/1024;
return memClass / 8;
}
NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并在原生的基础之上添加加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单,大致可以分为以下五步:
1.创建RequestQueue对象
2.创建一个ImageLoder对象
3. 在xml布局文件中添加NetworkImageView控件,在java代码中获取该控件的实例。
4. 设置要加载的图片地址和属性。
public class Demo_NetworkImageView extends AppCompatActivity {
private NetworkImageView networkImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.demo_network_image_view);
networkImageView = (NetworkImageView) findViewById(R.id.Volley_NetworkImageView);
Vollry_NetworkImageView();
}
private void Vollry_NetworkImageView() {
String imgUrl="http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg";
ImageLoader imageLoader = new ImageLoader(
MyApplication.getHttpQueues(),
new BitmapCache()
);
networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);
networkImageView.setErrorImageResId(R.mipmap.ic_launcher);
networkImageView.setImageUrl(
imgUrl,
imageLoader
);
}
}