Universal Image Loader:一个强大的图片加载库,包含各种各样的配置,最老牌,使用也最广泛。不支持gif
Picasso: Square出品,必属精品。和OkHttp搭配起来更配呦!不支持gif 内存占大
Fresco:Facebook出的,天生骄傲!不是一般的强大。
Glide:Google推荐的图片加载库,专注于流畅的滚动。Glide配置十分灵活,默认使用RGB_565的Bitmap ,默认使用HttpUrlConnection下载图片。
加载原理:
1:Glide.with(context)创建RequestManager
通过传入的context对象,RequestManager可以根据它的生命周期来管理当前的Request图片加载请求。
2:Glide.with(context).load(url)创建需要的Request
在这个方法根据我们需要进行设置,比如MemoryCache配置,error,展示等,相当于Glide加载图片的执行单位;
3:Glide.with(context).load(url).into(imageview)
如果已经有缓存了,那就直接用,没有的话会根据这个imageview的宽高进行加载。
缓存原理:
1:内存缓存:
使用内存缓存可以获得更快的图片加载速度,因为减少了耗时的IO操作。Glide中有一个叫做BitmapPool的类,可以复用其中的Bitmap对象,从而避免Bitmap对象的创建,减小内存开销
2:硬盘缓存:
Glide目前提供了四种缓存策略:
•DiskCacheStrategy.NONE 不缓存文件
•DiskCacheStrategy.SOURCE 只缓存原图
•DiskCacheStrategy.RESULT 只缓存最终加载的图(默认的缓存策略)
•DiskCacheStrategy.ALL 同时缓存原图和结果图
Fresco
背景:
Android 3.0以后,android的bitmap的数据存储在java heap中,java对dvm的heap大小是有限制的如果超过了这个限制,就会抛出OOM异常,于是fresco在native层申请内存来代替部分java层的内存,ashmem-匿名共享内存;这样Bitmap对象的创建、释放将永远不会触发GC,它的管理由Linux内核驱动管理。5.0以上系统,由于内存管理的优化,所以对于5.0以上的系统Fresco将Bitmap缓存直接放到了堆内存中
使用了三级缓存:Bitmap缓存+未解码图片缓存+硬盘缓存。
其中前两个就是内存缓存,Bitmap缓存根据系统版本不同放在了不同内存区域中,而未解码图片的缓存只在堆内存中,加快图片的加载速度,Fresco的加载图片的流程为:查找Bitmap缓存中是否存在,存在则直接返回Bitmap直接使用,不存在则查找未解码图片的缓存,如果存在则进行Decode成Bitmap然后直接使用并加入Bitmap缓存中,如果未解码图片缓存中查找不到,则进行硬盘缓存的检查,如有,则进行IO、转化、解码等一系列操作,最后成Bitmap供我们直接使用,并把未解码(Encode)的图片加入未解码图片缓存,把Bitmap加入Bitmap缓存中,如硬盘缓存中没有,则进行Network操作下载图片,然后加入到各个缓存中。
网友评论