使用Volley请求网络图片加载

前言

Google官方文档中并没有介绍Volley请求网络图片的方法,但实际上,Volley提供了十分强大的网络图片加载的功能,本文是对Volley关于请求网络图片的3种方式的学习总结,内容上参考了郭神的帖子(原文链接

Volley请求网络图片的方法

Volley请求网络图片的方法相比于StringJSON,要多一些方式,但从底层上看,还是基于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的源码会发现其背部包含了一个ImageRequestRequestQueue对象,本质上还是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的使用过程:

  1. 实例化ImageLoader对象;
  2. 实例化ImageLoader.ImageListener对象;
  3. 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是一个高度封装的网络图片自定义控件,个人理解是ImageRequestImageView的加强版,使用起来更加方便高效:


		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的封装,除了这个方法之外,还有setErrorImageResIdsetDefaultImageResId这两个方法,顾名思义,分别设置默认情况和错误情况的图片。

发布了222 篇原创文章 · 获赞 558 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/CV_Jason/article/details/102487794