Fresco正傳(7):如何手動清理Fresco的快取。
阿新 • • 發佈:2019-02-17
前言
這篇是隨手寫的,有博友在樓下提問相關問題。
這裡先把我知道的方案放這裡,以後有空詳細寫。
另外,請注意:雖然我找到了如何清理快取的方法,但是目前還未實際測試過。請自行測試哦。
正文
public class ImagePipelineConfigUtils {
//分配的可用記憶體
private static final int MAX_HEAP_SIZE = (int) Runtime.getRuntime().maxMemory();
//使用的快取數量
private static final int MAX_MEMORY_CACHE_SIZE = MAX_HEAP_SIZE / 4 ;
//小圖極低磁碟空間快取的最大值(特性:可將大量的小圖放到額外放在另一個磁碟空間防止大圖佔用磁碟空間而刪除了大量的小圖)
private static final int MAX_SMALL_DISK_VERYLOW_CACHE_SIZE = 20 * ByteConstants.MB;
//小圖低磁碟空間快取的最大值(特性:可將大量的小圖放到額外放在另一個磁碟空間防止大圖佔用磁碟空間而刪除了大量的小圖)
private static final int MAX_SMALL_DISK_LOW_CACHE_SIZE = 60 * ByteConstants.MB;
//預設圖極低磁碟空間快取的最大值
private static final int MAX_DISK_CACHE_VERYLOW_SIZE = 20 * ByteConstants.MB;
//預設圖低磁碟空間快取的最大值
private static final int MAX_DISK_CACHE_LOW_SIZE = 60 * ByteConstants.MB;
//預設圖磁碟快取的最大值
private static final int MAX_DISK_CACHE_SIZE = 100 * ByteConstants.MB;
//小圖所放路徑的資料夾名
private static final String IMAGE_PIPELINE_SMALL_CACHE_DIR = "ImagePipelineCacheSmall";
//預設圖所放路徑的資料夾名
private static final String IMAGE_PIPELINE_CACHE_DIR = "ImagePipelineCacheDefault";
public static ImagePipelineConfig getDefaultImagePipelineConfig(Context context) {
//記憶體配置
final MemoryCacheParams bitmapCacheParams = new MemoryCacheParams(
MAX_MEMORY_CACHE_SIZE,// 記憶體快取中總圖片的最大大小,以位元組為單位。
Integer.MAX_VALUE,// 記憶體快取中圖片的最大數量。
MAX_MEMORY_CACHE_SIZE,// 記憶體快取中準備清除但尚未被刪除的總圖片的最大大小,以位元組為單位。
Integer.MAX_VALUE,// 記憶體快取中準備清除的總圖片的最大數量。
Integer.MAX_VALUE);// 記憶體快取中單個圖片的最大大小。
//修改記憶體圖片快取數量,空間策略(這個方式有點噁心)
Supplier<MemoryCacheParams> mSupplierMemoryCacheParams = new Supplier<MemoryCacheParams>() {
@Override
public MemoryCacheParams get() {
return bitmapCacheParams;
}
};
//小圖片的磁碟配置
DiskCacheConfig diskSmallCacheConfig = DiskCacheConfig.newBuilder().setBaseDirectoryPath(context.getApplicationContext().getCacheDir())//快取圖片基路徑
.setBaseDirectoryName(IMAGE_PIPELINE_SMALL_CACHE_DIR)//資料夾名
.setMaxCacheSize(MAX_DISK_CACHE_SIZE)//預設快取的最大大小。
.setMaxCacheSizeOnLowDiskSpace(MAX_SMALL_DISK_LOW_CACHE_SIZE)//快取的最大大小,使用裝置時低磁碟空間。
.setMaxCacheSizeOnVeryLowDiskSpace(MAX_SMALL_DISK_VERYLOW_CACHE_SIZE)//快取的最大大小,當裝置極低磁碟空間
.setDiskTrimmableRegistry(NoOpDiskTrimmableRegistry.getInstance())
.build();
//預設圖片的磁碟配置
DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder().setBaseDirectoryPath(Environment.getExternalStorageDirectory().getAbsoluteFile())//快取圖片基路徑
.setBaseDirectoryName(IMAGE_PIPELINE_CACHE_DIR)//資料夾名
.setMaxCacheSize(MAX_DISK_CACHE_SIZE)//預設快取的最大大小。
.setMaxCacheSizeOnLowDiskSpace(MAX_DISK_CACHE_LOW_SIZE)//快取的最大大小,使用裝置時低磁碟空間。
.setMaxCacheSizeOnVeryLowDiskSpace(MAX_DISK_CACHE_VERYLOW_SIZE)//快取的最大大小,當裝置極低磁碟空間
.setDiskTrimmableRegistry(NoOpDiskTrimmableRegistry.getInstance())
.build();
//快取圖片配置
ImagePipelineConfig.Builder configBuilder = ImagePipelineConfig.newBuilder(context)
.setBitmapsConfig(Bitmap.Config.RGB_565)
.setBitmapMemoryCacheParamsSupplier(mSupplierMemoryCacheParams)
.setSmallImageDiskCacheConfig(diskSmallCacheConfig)
.setMainDiskCacheConfig(diskCacheConfig)
.setMemoryTrimmableRegistry(NoOpMemoryTrimmableRegistry.getInstance())
.setResizeAndRotateEnabledForNetwork(true);
// 就是這段程式碼,用於清理快取
NoOpMemoryTrimmableRegistry.getInstance().registerMemoryTrimmable(new MemoryTrimmable() {
@Override
public void trim(MemoryTrimType trimType) {
final double suggestedTrimRatio = trimType.getSuggestedTrimRatio();
Loger.d(String.format("onCreate suggestedTrimRatio : %d", suggestedTrimRatio));
if (MemoryTrimType.OnCloseToDalvikHeapLimit.getSuggestedTrimRatio() == suggestedTrimRatio
|| MemoryTrimType.OnSystemLowMemoryWhileAppInBackground.getSuggestedTrimRatio() == suggestedTrimRatio
|| MemoryTrimType.OnSystemLowMemoryWhileAppInForeground.getSuggestedTrimRatio() == suggestedTrimRatio
) {
ImagePipelineFactory.getInstance().getImagePipeline().clearMemoryCaches();
}
}
});
return configBuilder.build();
}
}