基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)

本案例是基于Volley网络库实现的加载多种网络图片,目前包括GIF动态图片、圆形图片、普通图片,还有待完善,欢迎提意见,或者一起完成。

前言

对于Volley,我相信我们都使用过,它也是Google推荐的网络加载框架,性能优秀。另外,我们也知道Volley可以加载网络图片,正常情况下,可以使用ImageRequest的用法、ImageLoader的用法和NetworkImageView的用法来加载网络图片。但是,有时候我们项目中加载图片可能需要不同的需求,所以我就在这基础上修改完成了加载多样化的网络图片的功能。当然现在Glide加载图片也是非常的好,Google也推荐了。

Github项目地址,欢迎star,欢迎一起完善

图片描述

1、修改ImageLoad与ImageRequeat

Volley中图片请求操作主要与ImageLoad与ImageRequeat这两个文件有关系,但是其中返回的是Bitmap对象,我们要修给使得返回缓冲区的ByteBuffer流。如下:

public interface ImageCache {
        ByteBuffer getBitmap(String url);
        void putBitmap(String url, ByteBuffer bitmap);
    }

2、基于LruCache实现内存缓存

具体的写法与Volley使用ImageLoad时缓存类似

public class LruImageCache extends LruCache<String, ByteBuffer> implements ImageLoader.ImageCache {
    
    public LruImageCache(int maxSize) {
        super(maxSize);
    }
    
    @Override
    protected int sizeOf(String key, ByteBuffer value) {
        return value.capacity();
    }
    
    @Override
    public ByteBuffer getBitmap(String url) {
        return get(url);
    }

    @Override
    public void putBitmap(String url, ByteBuffer bitmap) {
        put(url, bitmap);
    }
}

3、新建一个AsyncTask从缓存中数据流到UI显示图片

主要判断是否为GIF图片,如果是则加载,另外还要判断是否为圆形图片,如果是则加载

            // 判断是否为GIF图片,如果是则加载
            if ( LoadGif.isGif(mImageView, bytes) )
                return;

            Bitmap image = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            //判断是否为圆形图片,如果是则加载
            if(isCircle){
                mImageView.setImageBitmap(LoadGif.toRoundBitmap(image));
            }else{
                mImageView.setImageBitmap(image);
            }

4、感谢

最后,要感谢koral--本文的GIF图片显示库,就是这位大神的。koral--的Github
Gif图片加载采用koral--实现的android-gif-drawable ,此库底层使用C库进行Gif的编解码,效率和显示效果方面都非常棒。


林海听涛
54 声望5 粉丝

code everyday