Google官方文档中并没有介绍Volley请求网络图片的方法,但实际上,Volley提供了十分强大的网络图片加载的功能,本文是对Volley关于请求网络图片的3种方式的学习总结,内容上参考了郭神的帖子(原文链接)
Volley请求网络图片的方法相比于String
和JSON
,要多一些方式,但从底层上看,还是基于RequestQueue+XXXRequest 的方式,说白了,网络图片的请求本质上也是一种请求,只不过请求的内容比较丰富,是一个图片。
Volley中关于网络图片请求的主要接口有3个——
ImageRequest
ImageLoader
NetworkImageView
,顾名思义,可以理解为ImageRequest+ImageView的增强版,既具有ImageView的功能, 又能够通过Request的方式请求网络图片。下面分别介绍3种接口的用法。
一个简单的Demo:
String url = "https://raw.githubusercontent.com/zzuljs/CppLearning/master/CppLearning/raw/master/Itachi.jpg";
imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
Toast.makeText(getApplicationContext(),"Success!", Toast.LENGTH_LONG)
.show();
imageView.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.RGB_565,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),"Error!", Toast.LENGTH_LONG)
.show();
}
});
queue.add(imageRequest);
网络请求主要是通过ImageRequest
的构造器来实现的,这个构造器一共有6个参数,分别是:
public ImageRequest(
String url,
Response.Listener<Bitmap> listener,
int maxWidth,
int maxHeight,
ScaleType scaleType,
Config decodeConfig,
@Nullable Response.ErrorListener errorListener) ;
其中,实现网络请求的是Response.Listener
,而Response.ErrorListener errorListener
则对应了网络请求失败的情况,两者都可以在监听的抽象方法中实现具体的操作。
另外,maxWidth
限定了最大宽度,maxHeight
限定了最大宽度,这两个值一般设置为0,将宽和高交给ImageView来控制
Config decodeConfig
定义了图片的编码格式,取值为Bitmap.Config
的枚举型,ScaleType scaleType
定义了缩放比例。
ImageRequest
的使用过程与StringRequest
只有参数上的不同,实际过程是一样的。
ImageLoader
是基于ImageRequest
封装的一个网络图片请求的接口,如果查看ImageLoader
的源码会发现其背部包含了一个ImageRequest
和RequestQueue
对象,本质上还是Request
的方式。
使用ImageLoader
最简单的Demo:
String url = "https://raw.githubusercontent.com/zzuljs/CppLearning/master/CppLearning/raw/master/Itachi.jpg";
ImageLoader imageLoader = new ImageLoader(queue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
});
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,
R.drawable.ic_launcher_background,
R.drawable.ic_launcher_foreground);
imageLoader.get(url, listener);
看一下实现效果:
可以看到,ImageLoader
相比ImageRequest
多了一个默认加载图片和失败显示图片的选项,等于说是提供了请求过程和请求失败的情况所需要加载的图片。
梳理一下ImageLoader
的使用过程:
其中,实例化ImageLoader
对象的时候,用到了ImageCache
,这是一个能够提高加载高清大图性能的接口。
实例化ImageListener的时候,用到了getImageListener
方法,其中,第一个参数是ImageView
对象,即在对应的控件上进行图片的加载。
最后是get
方法,如果看源码实现的话,最终会看到层层封装的底层方法:
public ImageContainer get(
String requestUrl,
ImageListener imageListener,
int maxWidth,
int maxHeight,
ScaleType scaleType)
这个方法与ImageRequest
的构造器十分的类似。
NetworkImageView
继承自ImageView
是一个高度封装的网络图片自定义控件,个人理解是ImageRequest
和ImageView
的加强版,使用起来更加方便高效:
String url = "https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg";
ImageLoader loader = new ImageLoader(queue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
});
private NetworkImageView networkImageView = findViewByID(R.id.network_image);
networkImageView.setImageUrl(url, loader);
除此之外,还需要在布局中添加一个NetworkImageView
控件
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_gravity="center_horizontal"/>
最终实现效果:
NetworkImageView.setImageUrl
方法提供了网络请求图片的方法,显然,这是基于ImageLoader
的封装,除了这个方法之外,还有setErrorImageResId
和setDefaultImageResId
这两个方法,顾名思义,分别设置默认情况和错误情况的图片。