相信大家用过Fresco的都知道Android一个非常强大的Fresco图片加载框架自带三级缓存功能.
1.Bitmap缓存
Bitmap缓存存储Bitmap对象,这些Bitmap对象可以立刻用来显示或者用于后处理
在5.0以下系统,Bitmap缓存位于ashmem,这样Bitmap对象的创建和释放将不会引发GC,更少的GC会使你的APP运行得更加流畅。
5.0及其以上系统,相比之下,内存管理有了很大改进,所以Bitmap缓存直接位于Java的heap上。
当应用在后台运行时,该内存会被清空。
2.未解码图片的内存缓存
这个缓存存储的是原始压缩格式的图片。从该缓存取到的图片在使用之前,需要先进行解码。
如果有调整大小,旋转,或者WebP编码转换工作需要完成,这些工作会在解码之前进行。
APP在后台时,这个缓存同样会被清空。
3.文件缓存
和未解码的内存缓存相似,文件缓存存储的是未解码的原始压缩格式的图片,在使用之前同样需要经过解码等处理。
今天我们就来写一个缓存到本地的图片怎么使用代码将其重新获取出来,废话不多说,直接上代码阅读即懂,复制即用
首先我们要放上Fresco加载图片框架的第三方依赖
compile 'com.facebook.fresco:fresco:+'
activity_main布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.cf.MainActivity">
<!--网络请求的图片-->
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/interImg"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerVertical="true"
android:src="@mipmap/ic_launcher_round"
app:failureImage="@mipmap/ic_launcher_round"
app:placeholderImage="@mipmap/ic_launcher_round"
app:roundAsCircle="true" />
<!--网络缓存到本地之后获取的图片-->
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/cacheImg"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:src="@mipmap/ic_launcher_round"
app:failureImage="@mipmap/ic_launcher_round"
app:placeholderImage="@mipmap/ic_launcher_round" />
</RelativeLayout>
Java代码
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.facebook.binaryresource.FileBinaryResource;
import com.facebook.cache.common.SimpleCacheKey;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.view.SimpleDraweeView;
import java.io.File;
public class MainActivity extends AppCompatActivity {
private SimpleDraweeView interImg;
private SimpleDraweeView cacheImg;
private final String imgUrl = "http://d.lanrentuku.com/down/png/1712/22xiaodongwu/22xiaodongwu_12.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fresco.initialize(this);//初始化Fresco
setContentView(R.layout.activity_main);
interImg = (SimpleDraweeView) findViewById(R.id.interImg);//网络请求的图片的id
cacheImg = (SimpleDraweeView) findViewById(R.id.cacheImg);//从本地加载的图片的id
Uri parse = Uri.parse(imgUrl);
interImg.setImageURI(parse);
/**
* 获取缓存之后的图片
*/
FileBinaryResource resource = (FileBinaryResource)Fresco.getImagePipelineFactory().getMainFileCache().getResource(new
SimpleCacheKey(parse.toString()));
File file = resource.getFile();
/**
* 将文件转为uri形式
*/
Uri uri = Uri.fromFile(file);
cacheImg.setImageURI(uri);
}
}