Android加载图片缓存原则:
Android对于内存一定要倍加的珍惜使用
图片在加载的时候一般采用
三级缓存原则:
第一级 :内存 临时存贮
第二级 :磁盘(文件/SD卡)持久化存储
第三级 :网络 持久化
当想要加载一张图片的时候,首先去内存中查找,这张图片是否存在,如果存在,则直接加载,如果不存在去磁盘中查找,如果磁盘中存在,则将图片加载到内存中,并且展示出来,如果磁盘中不存在,则从网络获取,当下载成功后,存入磁盘中一份,加载到内存中,并且展示出来。
优势:1.加载更快捷
2.节省流量开销
3.减小服务器压力
一、Picasso - square公司出品。
A powerful image downloading and caching library for Android
Picasso的主要特性:
1.自带内存和硬盘的二级缓存功能
2.加载本地资源、资产(assets)、SD卡 及COntentProvider中的图片
3.在Adapter中需要取消已经不在视野范围的ImageView 图片资源的加载,否则会导致图片错位,Picasso解决了这个错位的问题
4.使用图片压缩尽可能的减少内存消耗
5.图形转换操作,如变换大小,旋转等,提供了借口让用户可以自定义转换操作
Picasso的基本用法
倒入Picasso 框架依赖。
compile 'com.squareup.picasso:picasso:2.5.2'
基本语法:
Picasso在(with)当前上下文中加载(load)一张图片到(into)ImageView控件
1.加载资源图片
Picasso.with(Context).load(R.mipmap.ic_launcher).into(ImageView);
2.记载资产目录图片(assets)
Picasso.with(Context).load(“file:///android_asset/xixi.png”).into(ImageView);
3.加载SD卡的图片
Picasso.with(Context).load(new File(Path)).into(ImageView);
4.加载网络图片
Picasso.with(Context).load(url).into(ImageView);
属性方法设置:
1.设置占位图片
Picasso可以设置下载前和下载出错时的图像,在下载图像被设置前,Picasso会尝试三次请求,三次请求都失败会显示error
Picasso.with(Context).load(Url)
.placeholder(R.mipmap.ic_empty) // 默认图片占位图
.error(R.mipmap.ic_launcher) //图片加载失败的图片
.into(ImageView)
2.设置无淡入淡出
.noFade();
3.图片重新调整大小
重新调整大小,一边更好的根据需求修改适配布局,减少存空间
.resize(width,height); // 宽高
.resizeDimen(targetWidthResId,targetHeightResid);dimen资源Id
4.图片裁切类型
Picasso.with(Context).load(Url)
.centerCrop() //根据热 resize尺寸对 图片进行裁剪
.centerInside() //根据resize尺寸对图片进行等比例缩放
.fit()
.into(ImageView);
<备注> : centerCrop/centerInside()需要配合resize()使用,
fit 不能配合resize使用
5.自定义图形转换
图形转换,也是为了更好的适配布局和减少存储
.transform(new Transformation(){
@Override
public Bitmap transform(Bitmap source){
int size = Math.min(source.getWidth.source.getHeight);// 获取最小值
Bitmap map = Bitmap.createBitmap(source,x,y,size,size);//正方形
source.recycle();
return map;
}
@Override
public String key(){
return “cricle”;
}
})
6.图片旋转
Picasso.with(Context).load(url).rotate().into(ImageView);
7.设置图片质量,对于不透明的图片可以使用
.config(Bitmap.Config.RGB_565);
RGB_565 // 一个像素占据2个自己 显示效果较为清晰
ARGB_8888// 默认 一个像素占据4个字节
ARGB_4444// 一个像素占据2个字节 显示效果不是很清晰
ALPHA_8// 一个像素占据2个字节 显示效果不是很清晰
图片的像素格式: 很多个像素组成了一张图片
Bitmap.Config.ARGB_8888 1个像素点就是 8×4= 32位 /8 = 4(b 字节)
Bitmap.Config.ARGB_4444 1个像素点就是 4×4= 16位 /8 = 2(b 字节)
Bitmap.Config.RGB_565 1个像素点就是 5+6+5 = 16位 /8 =2(b 字节)
A R G B
A = alpha 透明度
R = Red 红色
G = Green 绿色
B = Blue 蓝色
后面的尾数表示的是 8888 每个像素点占的位数
假设 有一张图片是 600× 800 大小
如果像素格式是ARGB_8888 600×800×4 = 1920000 字节 = 1920kb = 1.857M
如果像素格式是ARGB_4444 600×800×2 = 960000 字节= 960kb = 0.9M
如果像素格式是RGB_565 600×800×2 = 960000 字节 =960kb = 0.9M
8.查看大图时放弃内存缓存memorycache
Picasso默认会使用设备的15%的内存作为内存图片缓存,且现有的API无法清空内存缓存。
在查看大图时放弃使用内存缓存,图片从网路下载完成后会自动缓存到磁盘中,加载会从磁盘中加载,这样可以加速内存回收
Picasso.with(Conetxt).load(url)
.memoryPolicy(MemoruPolicy.NO_CACHE,MemoryPolicy.NO_STORE)
.into(ImageView);
<备注> :NO_CACHE 是指图片加载跳过从内存缓存中查找
NO_STORE 是指图片存储时不往内存缓存存储
9. 设置tag标签
设置网络请求的Tag
对于每次加载图片的时候,请求可以进行 一下三种动作(类似okHttp)
通过设置tag标签,可以用来pause、resume、cancel访问
Picasso.with(Context).pauseTag("”);
Picasso.with(Context).resumeTag("”);
Picasso.with(Context).cancelTag("”);
Application中常见的设置
初始化Picasso属性:
Picasso picasso = newPicasso.Builder(this)
//设置内存缓存大小,10M
.memoryCache(new LruCache(10 << 20))
//设置下载的图片格式,节省内存 默认时 ARGB_8888
.defaultBitmapConfig(Bitmap.Config.RGB_565)
//设置下载器, 默认是URLConnection
.downLoader(new UrlConnectionDownloader())
//
.downLoader(new OkHttpDownloader())
//设置调试标示 (图片左上角的三角形标记)
红色代表从网络获取的数据
蓝色代表从本地磁盘中获取的数据
绿色代表从内存中获取的数据
.indicatorsEnabled(true)
.build();
//设置Picasso单例模式
Picasso.setSingletonInstance(picasso);
二、Glide
An image loading and caching library for Android focused on smooth scrolling
Glide4.0及以上版本需要AndroidStudio3.0以上版本支持所以我们采用Glide3.6版本的Jar包
倒入方式:

然后选择:ProjectStructrue:

进行添加jar包的配置:

然后继续选择:

然后就可以正常使用了。
语法与Picasso基本一致。
三、Universal-Image-Loader
倒入依赖方式,在Gradle文件里面添加
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
在使用ImageLoader前:
//初始化ImageLoader
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this).build();
ImageLoader.getInstance().init(configuration);
使用:
//使用 ImageLoader加载图片
ImageLoader loader = ImageLoader.getInstance();
loader.displayImage(IMAGELOADER_IMAGE_URL, showIv);
// 参数配置
DisplayImageOptions options = new DisplayImageOptions.Builder().build();
//Loader 的监听器
loader.displayImage(IMAGELOADER_IMAGE_URL, showIv, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current, int total) {
//监听进度
}
});