关闭

Fresco正传(7):如何手动清理Fresco的缓存。

标签: 缓存Fresco
8285人阅读 评论(5) 收藏 举报
分类:

前言

这篇是随手写的,有博友在楼下提问相关问题。

这里先把我知道的方案放这里,以后有空详细写。

另外,请注意:虽然我找到了如何清理缓存的方法,但是目前还未实际测试过。请自行测试哦。

正文

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();
    }
}
1
0
查看评论

关于fresco的使用之--CacheKey获取本地缓存

最近自己做了一个app涉及到分享图片以及gif文件,查看过多个框架最终决定使用Facebook的fresco框架,功能很强大,具体可以看git链接https://github.com/desmond1121/Fresco-Source-Analysis。关于Fresco的说明不多说,这里主要说一下获...
  • asfhwh
  • asfhwh
  • 2016-01-04 15:27
  • 2914

fresco简单配置最大缓存大小

fresco简单配置最大缓存大小
  • huangsihua
  • huangsihua
  • 2015-11-18 11:07
  • 3650

Fresco清理缓存

清除缓存中的一条url ImagePipeline现有函数可以删除缓存中的一条url。 ImagePipeline imagePipeline = Fresco.getImagePipeline(); Uri uri; imagePipeline.evictFromMemoryCache...
  • u011164565
  • u011164565
  • 2016-05-06 15:55
  • 1805

关于Fresco的缓存清理的那些事

前言我相信很多人对Fresco这个优秀的第三方网络图片处理框架不陌生,无论从使用还是配置而言都是很人性化的简单,今天要讲述的是我遇到的关于缓存清理的事情。(原文)正文 Fresco自身的缓存清理时机 当我们手动退出整个app的时候,发现之前加载过的图片不会出现重新加载的情况,说明这种情况下,缓存依...
  • xing_xiangrong
  • xing_xiangrong
  • 2016-12-23 11:16
  • 505

Fresco的缓存机制

Fresco的图片获取及缓存由ImagePipeline模块实现,具体见下图: 图1 三级缓存三级缓存1.Bitmap缓存Bitmap缓存存储Bitmap对象,这些Bitmap对象可以立刻用来显示或者用于后处理在5.0以下系统,Bitmap缓存位于ashmem,这样Bitmap对象的创建和释...
  • lufqnuli
  • lufqnuli
  • 2016-06-12 16:36
  • 4713

Fresco 5.0以上内存持续增长问题优化

fresco是android一款比较好的图片处理框架,特别是在5.0以下,效果很佳。在5.0以下系统,Fresco将图片放到一个特别的内存区域ashmem中。这块内存我们通过android studio查看时不会显示,回收机制与java回收机制差不多。当然,在图片不显示的时候,占用的内存会自动被释放...
  • tsdfk1455
  • tsdfk1455
  • 2017-03-24 13:29
  • 3652

Fresco的磁盘缓存

public class ImagePipelineConfigUtils { //分配的可用内存 private static final int MAX_HEAP_SIZE = (int) Runtime.getRuntime().maxMemory(); //使用的...
  • qubentao
  • qubentao
  • 2018-01-10 19:48
  • 112

fackbook的Fresco的Image Pipeline以及自身的缓存机制

fackbook的Fresco的Image Pipeline以及自身的缓存机制 配置之前、首先需要知道两点:一点是Bitmap缓存、一点是如果你仅仅需要一个缓存,那么不调用setSmallImageDiskCacheConfig即可。Image pipeline 默认会使用同一个缓存,同时Im...
  • DJY1992
  • DJY1992
  • 2015-09-08 15:39
  • 15145

fresco源码分析-内存回收

fresco 内存 OOM
  • brycegao321
  • brycegao321
  • 2016-09-05 15:31
  • 2660

谈谈fresco的bitmap内存分配

bitmap的内存分配主要有两个含义: 应用程序实现时针对bitmap的内存缓存;从原始数据(byte[])经过decode生成bitmap过程中的内存分配问题; 其中第一个含义,在Fresco中实现对应的就是interface MemoryCache,这里略有提及,不会大费章...
  • chiefhsing
  • chiefhsing
  • 2016-12-29 01:18
  • 2135
    个人资料
    • 访问:378170次
    • 积分:5617
    • 等级:
    • 排名:第5603名
    • 原创:206篇
    • 转载:8篇
    • 译文:0篇
    • 评论:145条
    博客专栏
    文章分类
    最新评论