将Glide缓存到外部存储器(SD卡)

18

我在我的安卓应用中使用 Glide 来加载图片。
在3.5更新后,开发者提供了 GlideModule 接口。
根据 这篇文章(硬盘缓存),我可以使用 setDiskCache 方法和 ExternalCacheDiskCacheFactory 来设置缓存目录。
但是我并没有看到任何区别。所有的缓存仍然存储在默认的内部存储缓存目录中。


build.gradle:

dependencies {
    ...
    compile 'com.github.bumptech.glide:glide:3.6.1'
}

Android清单文件:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application ...>
<meta-data
        android:name="com.myapp.GlideConfig"
        android:value="GlideModule" />
</application>

GlideConfig.java

public class GlideConfig implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            Log.e("GlideConfig", "MEDIA_MOUNTED");
            builder.setDiskCache(
                context.getString(R.string.app_name),
                        419430400));//400Mb
            //Environment.getExternalStorageDirectory().getPath()
            // + "/"
            // + context.getString(R.string.app_name)
        }
        else {
            Log.e("GlideConfig", "!MEDIA_MOUNTED");
        }
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
    }
}

proguard-rules.pro

...
-keepnames class * com.myapp.GlideConfig

Glide使用方法:

Glide.with(context)
.load("some_url")
.dontAnimate()
.centerCrop()
.override(100, 100)
.into(holder.iv_image);

你认为什么是“内部存储默认缓存目录”?代码看起来没问题,所以我想知道这是否只是关于Android认为什么是内部/外部存储的混淆问题。 - Tim Malseed
@TimMalseed,没有任何混淆。Glide和其他图像加载器默认将图像缓存放置在'/data/data/com.package/cache'(内部存储)中。但是,“GlideModule”功能应该可以解决问题。也许我漏掉了什么。 - Volodymyr Kulyk
你在测试哪个设备/ROM?你不能说“没有混淆”。当涉及到Android上的内部/外部存储时,即使是Google也感到困惑。 - Tim Malseed
@TimMalseed 三星Galaxy S2。 - Volodymyr Kulyk
1
如果您在GlideModule的applyOptions中放置了一个日志语句,是否会打印任何内容?您能将问题缩小到Factory或GlideModule吗? - Sam Judd
@SamJudd 是的,请查看 GlideConfig.java 更新。在应用程序启动时记录“GlideConfig”“MEDIA_MOUNTED”。 - Volodymyr Kulyk
1个回答

12

为了使用GlideBuilder并设置setDiskCache的值,您可以将您的ExternalStorageDirectory设置为缓存目录。

  if (!Glide.isSetup()) {
   GlideBuilder gb = new GlideBuilder(this);
   DiskCache dlw = DiskLruCacheWrapper.get(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/YourCacheDirectory/"), 250 * 1024 * 1024);
   gb.setDiskCache(dlw);
   Glide.setup(gb);
}

请查看无法设置GlideBuilder

希望对您有所帮助。


2
setDiskCache已经被弃用了:( - abbasalim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接