【问题标题】:Glide, Clear cache when cache size is larger than 50 mbGlide,当缓存大小大于 50 mb 时清除缓存
【发布时间】:2017-03-15 06:23:28
【问题描述】:

我正在使用 Glide 库来加载图像。我的应用程序中有很多图像,所以一旦缓存大小大于 50 MB,我想清除缓存。 有人可以帮我这样做吗?

【问题讨论】:

    标签: android android-glide cache-control image-loading


    【解决方案1】:

    在 UI 线程外调用 Glide.get(context).clearDiskCache()。 (也考虑 clearMemory() 以防止清除磁盘缓存后出现意外)这对我有用

    new Thread(new Runnable() {
              @Override
              public void run() {
                 Glide.get(MainActivity.this).clearDiskCache();
              }
         }).start();
    

    我的应用中有很多图像,所以我想在缓存大小大于 50 mb 时清除缓存。

    如果你想限制 50 mb,你可以实现 glide 模块

    import android.annotation.TargetApi;
    import android.content.Context;
    import android.os.Build;
    import android.os.Environment;
    import android.os.StatFs;
    import android.util.Log;
    
    import com.bumptech.glide.Glide;
    import com.bumptech.glide.GlideBuilder;
    import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
    import com.bumptech.glide.module.GlideModule;
    import com.example.MyApplication;
    
    import java.util.Locale;
    
    public class LimitCacheSizeGlideModule implements GlideModule {
        // Modern device should have 8GB (=7.45GiB) or more!
        private static final int SMALL_INTERNAL_STORAGE_THRESHOLD_GIB = 6;
        private static final int DISK_CACHE_SIZE_FOR_SMALL_INTERNAL_STORAGE_MIB = 50*1024*1024;
    
        @Override
        public void applyOptions(Context context, GlideBuilder builder) {
            if (MyApplication.from(context).isTest()) return; // NOTE: StatFs will crash on robolectric.
    
            double totalGiB = getTotalBytesOfInternalStorage() / 1024.0 / 1024.0 / 1024.0;
            Log.i(String.format(Locale.US, "Internal Storage Size: %.1fGiB", totalGiB));
            if (totalGiB < SMALL_INTERNAL_STORAGE_THRESHOLD_GIB) {
                Log.i("Limiting image cache size to " + DISK_CACHE_SIZE_FOR_SMALL_INTERNAL_STORAGE_MIB + "MiB");
                builder.setDiskCache(new InternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE_FOR_SMALL_INTERNAL_STORAGE_MIB));
            }
        }
    
        @Override
        public void registerComponents(Context context, Glide glide) {
        }
    
        private long getTotalBytesOfInternalStorage() {
            // http://stackoverflow.com/a/4595449/1474113
            StatFs stat = new StatFs(Environment.getDataDirectory().getPath());
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
                return getTotalBytesOfInternalStorageWithStatFs(stat);
            } else {
                return getTotalBytesOfInternalStorageWithStatFsPreJBMR2(stat);
            }
        }
    
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
        private long getTotalBytesOfInternalStorageWithStatFs(StatFs stat) {
            return stat.getTotalBytes();
        }
    
        @SuppressWarnings("deprecation")
        private long getTotalBytesOfInternalStorageWithStatFsPreJBMR2(StatFs stat) {
            return (long) stat.getBlockSize() * stat.getBlockCount();
        }
    }
    

    然后在你的清单中像这样添加它

    <manifest
    
        ...
    
        <application>
    
            <meta-data
                android:name="YourPackageNameHere.LimitCacheSizeGlideModule"
                android:value="GlideModule" />
    
            ...
    
        </application>
    </manifest>    
    

    【讨论】:

    • 如何知道当前缓存大小,以便在当前缓存大小超过 50 MB 时调用上述方法?
    • 一旦我将限制设置为 50 MB,是否需要使用 Glide.get(MainActivity.this).clearDiskCache(); 清除缓存还是图书馆会自动这样做?
    • no @SapnaSharma 它将设置您无需手动清除的限制,它将自动完成
    • 好的,谢谢。让我试试这个。
    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 2015-12-20
    • 2020-02-29
    • 2018-02-16
    • 2013-07-05
    • 2012-02-08
    • 2016-10-13
    • 2015-01-21
    相关资源
    最近更新 更多