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的生命周期,在应用程序关闭的时候终止加载。
缓存设置
- 某些情形下,你可能希望只要图片不在缓存中则加载直接失败(比如省流量模式)。如下设置则如果图片在内存缓存或在磁盘缓存中,它会被展示出来。否则只要这个选项被设置为 true ,这次加载会视同失败。
GlideApp.with(fragment)
.load(url)
.onlyRetrieveFromCache(true)
.into(imageView);
- 如果你想跳过磁盘和/或内存缓存(比如图片验证码),如下设置:
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优点:
- 生命周期集成。
- 复用和主动回收bitmap,减少系统回收压力。
- 缓存策略灵活,多种规格缓存。
glide缺点:
- Java heap比Fresco高。
fresco优点:
- 在5.0以下系统(最低2.3)对bitmap的加载效率高,Fresco将图片放到一个特别的内存区域(Ashmem区)。
- 大大减少OOM(在更底层的Native层对OOM进行处理,图片将不再占用App的内存)。
fresco缺点:
- 包较大(2~3M)
- 用法复杂