轉載請註明出處 Fresco源代碼文檔翻譯項目請看這裏:Fresco源代碼文檔翻譯項目 硬盤緩存是android圖片框架中比較重要的一個模塊,Fresco中本身重寫了一個硬盤緩存框架,代替了android自己的DiskLruCache,因此今天咱們就來介紹Fresco中的硬盤緩存,而且將其提取出來成爲咱們本身的框架。我已經成功提取出了 Fresco 中的硬盤緩存框架,這是項目地址Frsco硬盤緩存框架項目地址,建議你們在看文章的時候結合項目代碼,項目中的每一個class文件中都有註釋,看起來仍是比較容易的。android
先上一張圖,讓你們簡單瞭解各個接口提供的api。 git
這個class的代碼就不貼了,強烈建議讀者把我前面的項目下載下來,結合博客一塊兒觀看。github
這個類是DiskStorage接口的實現類,前面說了這個類是直接與android的文件系統打交道的類。這個類有如下幾個功能特色:算法
一樣不貼代碼,再次建議你們下載項目代碼觀看博客。編程
這個類是FileCache的實現類,其經過DefaultDiskStorage與android文件系統打交道,而且處理文件緩存的各類邏輯。來講說它的功能特色:設計模式
Fresco在使用硬盤緩存框架的時候,與其餘模塊通訊的時候使用了兩個類DiskCacheConfig和DiskStorageCache。DiskCacheConfig很好理解,負責用Builder模式建立一個DiskStorageCache。因此這裏歸更到底就是使用DiskStorageCache暴露出來的增刪改查等api,而硬盤緩存框架中的其餘類與Fresco的其餘模塊是解耦的,這也是軟件工程中的一個重要的思想。因此接下來咱們就來使用一下DiskStorageCache,也算是對這篇博客的總結。api
這裏代碼很少因此貼下代碼:緩存
public class MainActivity extends AppCompatActivity {
FileCache mFileCache;
Button buttonInsert;
Button buttonHasKey;
Button buttonRemove;
Button buttonClearAll;
Button buttonGetCache;
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDiskCache();
initView();
final int[] times = {0};
buttonInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SimpleCacheKey simpleCacheKey=new SimpleCacheKey(String.valueOf(times[0]));
times[0]++;
insert(simpleCacheKey);
}
});
buttonHasKey.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "key 5 是否存在?" + mFileCache.hasKey(new SimpleCacheKey("5")), Toast.LENGTH_SHORT).show();
}
});
buttonRemove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
times[0]--;
SimpleCacheKey simpleCacheKey=new SimpleCacheKey(String.valueOf(times[0]));
mFileCache.remove(simpleCacheKey);
}
});
buttonClearAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mFileCache.clearAll();
times[0]=0;
}
});
buttonGetCache.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getCache();
}
});
}
private void initDiskCache(){
DiskCacheConfig diskCacheConfig=DiskCacheConfig.newBuilder(this).build();
Toast.makeText(this, "緩存文件夾:"+diskCacheConfig.getBaseDirectoryPathSupplier().get().getPath(), Toast.LENGTH_SHORT).show();
DefaultDiskStorage defaultDiskStorage=new DefaultDiskStorage(
diskCacheConfig.getBaseDirectoryPathSupplier().get(),
diskCacheConfig.getVersion(),
diskCacheConfig.getCacheErrorLogger());
DiskStorageCache.Params params = new DiskStorageCache.Params(
diskCacheConfig.getMinimumSizeLimit(),
diskCacheConfig.getLowDiskSpaceSizeLimit(),
diskCacheConfig.getDefaultSizeLimit());
CacheEventListener cacheEventListener=new CacheEventListener() {
@Override
public void onHit(CacheEvent cacheEvent) throws IOException {
Log.d("MainActivity Cache hit", cacheEvent.getCacheKey().getUriString());
Log.d("MainActivity", "mFileCache.getDumpInfo():" + mFileCache.getDumpInfo());
}
@Override
public void onMiss(CacheEvent cacheEvent) throws IOException {
Log.d("MainActivity Cache miss", cacheEvent.getCacheKey().getUriString());
Log.d("MainActivity", "mFileCache.getDumpInfo():" + mFileCache.getDumpInfo());
}
@Override
public void onWriteAttempt(CacheEvent cacheEvent) throws IOException {
Log.d("MainActivity Cache write start", cacheEvent.getCacheKey().getUriString());
Log.d("MainActivity", "mFileCache.getDumpInfo():" + mFileCache.getDumpInfo());
}
@Override
public void onWriteSuccess(CacheEvent cacheEvent) throws IOException {
Log.d("MainActivity Cache write success", cacheEvent.getCacheKey().getUriString());
Log.d("MainActivity", "mFileCache.getDumpInfo():" + mFileCache.getDumpInfo());
}
@Override
public void onReadException(CacheEvent cacheEvent) {
Log.d("MainActivity Cache ReadException", cacheEvent.getCacheKey().getUriString());
}
@Override
public void onWriteException(CacheEvent cacheEvent) {
Log.d("MainActivity Cache WriteException", cacheEvent.getCacheKey().getUriString());
}
@Override
public void onEviction(CacheEvent cacheEvent) throws IOException {
Log.d("MainActivity Cache Eviction", cacheEvent.getCacheKey().getUriString());
Log.d("MainActivity", "mFileCache.getDumpInfo():" + mFileCache.getDumpInfo());
}
@Override
public void onCleared() throws IOException {
Log.d("MainActivity", "Cleared");
Log.d("MainActivity", "mFileCache.getDumpInfo():" + mFileCache.getDumpInfo());
}
};
mFileCache=new DiskStorageCache(
defaultDiskStorage,
diskCacheConfig.getEntryEvictionComparatorSupplier(),
params,
cacheEventListener,
diskCacheConfig.getCacheErrorLogger(),
diskCacheConfig.getDiskTrimmableRegistry(),
diskCacheConfig.getContext(),
Executors.newSingleThreadExecutor(),
diskCacheConfig.getIndexPopulateAtStartupEnabled());
}
private void initView(){
buttonInsert=(Button)findViewById(R.id.insert);
buttonHasKey=(Button)findViewById(R.id.hasKey);
buttonRemove=(Button)findViewById(R.id.remove);
buttonClearAll=(Button)findViewById(R.id.clearAll);
buttonGetCache=(Button)findViewById(R.id.getCache);
imageView=(ImageView)findViewById(R.id.image);
}
private void insert(SimpleCacheKey simpleCacheKey){
try {
mFileCache.insert(simpleCacheKey, new WriterCallback() {
@Override
public void write(OutputStream os) throws IOException {
FileUtils.bitmapToFile(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher),os);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
private void getCache(){
BinaryResource diskCacheResource = mFileCache.getResource(new SimpleCacheKey("2"));
if (diskCacheResource==null) Toast.makeText(this, "miss 2", Toast.LENGTH_SHORT).show();
else {
Toast.makeText(this, "hit 2", Toast.LENGTH_SHORT).show();
try {
imageView.setImageBitmap(BitmapFactory.decodeStream(diskCacheResource.openStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
複製代碼
以上就是Fresco硬盤緩存框架的使用。安全
Fresco的硬盤緩存框架,仍是挺有趣的,其中用到了許多軟件工程的思想與Java設計模式。Fresco中還有許多模塊很是有趣,作個預告下一篇博客將會分析Fresco的內存緩存框架有興趣的同窗必定別錯過了。網絡