Volley请求网络图片的方法
Volley请求网络图片的方法相比于String和JSON,要多一些方式,但从底层上看,还是基于RequestQueue+XXXRequest 的方式,说白了,网络图片的请求本质上也是一种请求,只不过请求的内容比较丰富,是一个图片。
Volley中关于网络图片请求的主要接口有3个——
最基础的用法: ImageRequest
基于Request封装的ImageLoader
自定义控件NetworkImageView,顾名思义,可以理解为ImageRequest+ImageView的增强版,既具有ImageView的功能, 又能够通过Request的方式请求网络图片。
下面分别介绍3种接口的用法。
ImageRequest
一个简单的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<Bitmap> listener,而Response.ErrorListener errorListener则对应了网络请求失败的情况,两者都可以在监听的抽象方法中实现具体的操作。
另外,maxWidth限定了最大宽度,maxHeight限定了最大宽度,这两个值一般设置为0,将宽和高交给ImageView来控制
Config decodeConfig定义了图片的编码格式,取值为Bitmap.Config的枚举型,ScaleType scaleType定义了缩放比例。
ImageRequest的使用过程与StringRequest只有参数上的不同,实际过程是一样的。
ImageLoader
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对象;
实例化ImageLoader.ImageListener对象;
get方法加载url图像
其中,实例化ImageLoader对象的时候,用到了ImageCache,这是一个能够提高加载高清大图性能的接口。
实例化ImageListener的时候,用到了getImageListener方法,其中,第一个参数是ImageView对象,即在对应的控件上进行图片的加载。
最后是get方法,如果看源码实现的话,最终会看到层层封装的底层方法:
public ImageContainer get( String requestUrl, ImageListener imageListener, int maxWidth, int maxHeight, ScaleType scaleType)
这个方法与ImageRequest的构造器十分的类似。
NetworkImageView
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这两个方法,顾名思义,分别设置默认情况和错误情况的图片。
发表评论 取消回复