三方图片加载框架glide Picasso fresco,三级缓存

最常用的图片加载框架是:Gilde,Fresco,Picasso。Fresco是Facebook提供的开源图片加载库,它能够从网络,本地存储和Android资源文件中加载图片,且具有三级缓存设计(2级内存,1级文件)。

两者的使用很相似,但是也有很大的区别:

首先:

Glide加载的图片没有Picasso那么平滑

Picasso的内存开销远大于Glide,Picasso是加载了全尺寸的图片到内存,然后让GPU来实时重绘大小。而Glide加载的大小和ImageView的大小是一致的,因此更小,虽然内存开销差距不大,但是在这个问题上Glide完胜Picasso。因为Glide可以自动计算出任意情况下的ImageView大小。

Picasso和Glide在磁盘缓存策略上有很大的不同。Picasso缓存的是全尺寸的,而Glide缓存的是跟ImageView尺寸相同的

尝试将ImageView调整成不同大小,但不管大小如何Picasso只缓存一个全尺寸的。Glide则不同,它会为每种大小的ImageView缓存一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来

Glide的这种方式优点是加载显示非常快。而Picasso的方式则因为需要在显示之前重新调整大小而导致一些延迟,即便你添加了这段代码来让

对我而言,我更喜欢Glide,因为它远比Picasso快,虽然需要更大的空间来缓存

Glide 简介

Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。

Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide的Api是如此的灵活,开发者甚至可以插入和替换成自己喜爱的任何网络请求框架。
默认情况下,Glide使用的是一个定制化的基于 HttpUrlConnection 的栈,但同时也提供了与 Google Volley 和 Square OkHttp 快速集成的工具库。

虽然Glide 的主要目标是让任何形式的图片列表的滚动尽可能地变得更快、更平滑,但实际上,Glide几乎能满足你对远程图片的拉取/缩放/显示的一切需求。

2,glide的使用

1、导入依赖

implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'

2、添加权限




3、加载图片
一般使用只加载图片

Glide.with(fragment)
    .load(url)
    .into(imageView);

加载圆形图片

//      .transform(new RoundedCorners(24))直接也可以
RequestOptions mRequestOptions = RequestOptions.circleCropTransform()//圆形方法
            .skipMemoryCache(true);//不做内存缓存

    GlideApp.with(this)
            .load("https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg")
            .centerCrop()
            .apply(mRequestOptions)
            .placeholder(R.drawable.ic_launcher_background)//加载中显示的图片
            .error(R.drawable.ic_launcher_foreground)// 错误后显示的图片
            .into(mImg);

加载圆角

//设置图片圆角角度
RoundedCorners roundedCorners= new RoundedCorners(6);
//通过RequestOptions扩展功能,override:采样率,因为ImageView就这么大,可以压缩图片,降低内存消耗
RequestOptions options=RequestOptions.bitmapTransform(roundedCorners).override(300, 300);
 
GlideApp.with(this)
.load("https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg")
.apply(options)
.into(img);

3、Glide图片缓存

磁盘缓存策略(Disk Cache Strategy)

Glide.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.ALL)
  .into(imageView);

仅从缓存加载图片

Glide.with(fragment)
  .load(url)
  .onlyRetrieveFromCache(true)
  .into(imageView);

跳过缓存

Glide.with(fragment)
  .load(url)
  .skipMemoryCache(true)
  .into(view);

清除缓存

// This method must be called on the main thread.
Glide.get(context).clearMemory();
new AsyncTask {
  @Override
  protected Void doInBackground(Void... params) {
    // This method must be called on a background thread.
    Glide.get(applicationContext).clearDiskCache();
    return null;
  }
}

Fresco简介

依赖方面,Picasso是独立依赖,配置的时候直接在gradle脚本中添加compile 'com.squareup.picasso:picasso:x.x.x'

1、添加依赖

implementation 'com.facebook.fresco:fresco:1.13.0'

2、添加权限


3、基本用法

// 布局文件

// 初始化
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}

// 加载图片
SimpleDraweeView draweeView = this.findViewById(R.id.draweeView);
Uri uri = Uri.parse("https://www.baidu.com/img/bd_logo1.png");
draweeView.setImageURI(uri);

总结一下

Fresco加载图片过多会导致图片无法显示,

Glide两个控件同时请求同一个URL,网络请求是两次,
Imageloader一次加载图片也会请求两次URL,不知道是不是设置的问题,

Picasso完美的解决了以上所有问题。虽然这个框架逐渐被Fresco和Glide代替了

缓存机制

内存缓存,读取速度最快。

硬盘缓存(文件缓存),读取速度比内存缓存稍慢。

网络缓存,读取速度最慢。

其中内存缓存和硬盘缓存对应的类分别是LruCache和DiskLruCache。Android在Android 3.1加入了LruCache缓存类,其中维护着一个LinkedHashMap。当我们的APP中想要加载某张图片时,先去LruCache中寻找图片,如果LruCache中有,则直接取出来使用,如果LruCache中没有,则去文件系统中寻找,如果有则取出来使用,同时将图片添加到LruCache中,如果没有,则连接网络从网上下载图片。图片下载完成后,将图片通过DiskLruCache缓存到本地,然后放到LruCache中。

Glide缓存

Glide虽然只有内存和磁盘缓存,在性能上比不上Fresco;但他也有另外的优点, Fresco缓存的时候,只会缓存原始图像,而Glide则会根据ImageView控件尺寸获得对应的大小的bitmap来展示,从而缓存也可以针对不同的对象:原始图像(source),结果图像(result); 可以通过.diskCacheStrategy()方法设置:

public enum DiskCacheStrategy {    
      /** Caches with both {@link #SOURCE} and {@link #RESULT}. */    
      ALL(true, true),    
      /** Saves no data to cache. */    
      NONE(false, false),    
      /** Saves just the original data to cache. */    
      SOURCE(true, false),    
      /** Saves the media item after all transformations to cache. */    
      RESULT(false, true);
}

Fresco缓存

Fresco缓存也是一大亮点, 三级缓存,分别是 Bitmap缓存,未解码图片缓存, 文件缓存。
这里提一点Bitmap缓存:在5.0以下系统,Bitmap缓存位于ashmem,这样Bitmap对象的创建和释放将不会引发GC,更少的GC会使你的APP运行得更加流畅。5.0及其以上系统,相比之下,内存管理有了很大改进,所以Bitmap缓存直接位于Java的heap上。
另外,磁盘缓存还可以通过代码来设置不同手机的缓存容量:

String diskCacheUniqueName){
DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(context)
        .setMaxCacheSize(DISK_CACHE_SIZE_HIGH)
        .setMaxCacheSizeOnLowDiskSpace(DISK_CACHE_SIZE_LOW)
        .setMaxCacheSizeOnVeryLowDiskSpace(DISK_CACHE_SIZE_VERY_LOW)
        .build();

ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
        .setMainDiskCacheConfig(diskCacheConfig)
        .build();
Fresco.initialize(context, config);

参考链接:

Glide简介:

项目地址:https://github.com/bumptech/glide

官方文档:https://muyangmin.github.io/glide-docs-cn/

glide加载图片:https://www.jianshu.com/p/2edd1767d66b

Fresco简介:

项目地址:https://github.com/facebook/fresco

官方文档:https://frescolib.org/

缓存:https://blog.csdn.net/csdn_aiyang/article/details/80683479

你可能感兴趣的:(三方图片加载框架glide Picasso fresco,三级缓存)