1. 程式人生 > >Android Fresco獲取本地快取的圖片

Android Fresco獲取本地快取的圖片

相信大家用過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);

    }
}