Android缓存策略与图片加载

Android缓存策略

当程序第一次从网络加载图片后,就将其缓存到存储设备和内存中。当下次程序使用图片时,会先从内存中获取,如果内存中没有再从存储设备中获取,如果存储设备中也没有,则从网络上下载这张图片。

从内存中加载图片比从存储设备中加载图片要快,可以提高程序的效率且节约流量。

LRU(Least Recently Used)是一种常用的缓存算法。即近期最少使用算法。
LRU核心思想是当缓存满时,优先淘汰那些近期最少使用的缓存对象。

LruCache

LruCache是Android3.1提供的缓存类,Android官方API。可以用support-v4兼容包中提供的LruCache兼容早期Android版本。
LruCache是一个泛型类,内部采用一个LinkedHashMap以强引用的方式存储缓存的对象。LruCache线程安全。

DiskLruCache

DiskLruCache用于实现存储设备缓存。DiskLruCache非Android官方API。

glide

提供:bumptech
地址:https://github.com/bumptech/glide
当前版本:4.8.0
Glide是一个快速高效的Android图片加载库。
Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。
Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。

链式调用

	ImageView imageView = findViewById(R.id.test);
    ImgurGlide.with(getApplicationContext())
            .load(imageUrl)
            .into(imageView);

配合生命周期使用

Glide在加载资源的时候,如果是在Activity、Fragment上进行,当Activity、Fragment等组件进入不可见,或者已经销毁的时候,Glide 会停止加载资源。
如果不在Activity/Fragment上进行,则根据Application的生命周期,在应用程序关闭的时候终止加载。

缓存设置

  1. 某些情形下,你可能希望只要图片不在缓存中则加载直接失败(比如省流量模式)。如下设置则如果图片在内存缓存或在磁盘缓存中,它会被展示出来。否则只要这个选项被设置为 true ,这次加载会视同失败。
GlideApp.with(fragment)
  .load(url)
  .onlyRetrieveFromCache(true)
  .into(imageView);
  1. 如果你想跳过磁盘和/或内存缓存(比如图片验证码),如下设置:
GlideApp.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.NONE)
  .skipMemoryCache(true)
  .into(view);

fresco

提供:facebook
地址:https://github.com/facebook/fresco
当前版本:1.10.0

添加依赖

build.gradle文件中添加依赖

dependencies {
  // 其他依赖
  compile 'com.facebook.fresco:fresco:1.5.0'
}

下面的依赖需要根据需求添加:

dependencies {

  // 支持 GIF 动图,需要添加
  compile 'com.facebook.fresco:animated-gif:1.5.0'

  // 支持 WebP (静态图+动图),需要添加
  compile 'com.facebook.fresco:animated-webp:1.5.0'
  compile 'com.facebook.fresco:webpsupport:1.5.0'

  // 仅支持 WebP 静态图,需要添加
  compile 'com.facebook.fresco:webpsupport:1.5.0'

  // 添加Android支持包(你可能已经添加了该依赖或者类似的依赖包)
  compile 'com.android.support:support-core-utils:25.3.1'
}

初始化

在Application中调用Fresco.initialize初始化Fresco类。

	Fresco.initialize(this);

SimpleDraweeView

使用com.facebook.drawee.view.SimpleDraweeView展示图片。

	<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/my_image_view"
    android:layout_width="130dp"
    android:layout_height="130dp"
    fresco:placeholderImage="@drawable/my_drawable"
  />
Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png");
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(uri);

glide和fresco对比

glide优点:

  1. 生命周期集成。
  2. 复用和主动回收bitmap,减少系统回收压力。
  3. 缓存策略灵活,多种规格缓存。

glide缺点:

  1. Java heap比Fresco高。

fresco优点:

  1. 在5.0以下系统(最低2.3)对bitmap的加载效率高,Fresco将图片放到一个特别的内存区域(Ashmem区)。
  2. 大大减少OOM(在更底层的Native层对OOM进行处理,图片将不再占用App的内存)。

fresco缺点:

  1. 包较大(2~3M)
  2. 用法复杂

猜你喜欢

转载自blog.csdn.net/weixin_33642281/article/details/83758650