Nit*_*tri 55 android caching android-glide
我在我的一个项目中使用Glide来显示文件中的图像.
下面是我的代码如何显示图像:
Glide.with(DemoActivity.this)
.load(Uri.parse("file://" + imagePath))
.into(mImage);
Run Code Online (Sandbox Code Playgroud)
此位置(imagePath
)的图像不断变化.默认情况下,滑动缓存它在中显示的图像ImageView
.因此,Glide正在缓存中显示该位置新图像的第一张图像.
如果我imagePath
使用具有相同名称的其他图像更改位置处的图像,则Glide将显示第一个图像而不是新图像.
两个查询是:
是否可以始终从文件中的图像而不是缓存?这样问题就解决了.
在获取新替换的图像之前,是否可以从缓存中清除图像?这也将解决问题.
Nit*_*tri 119
这就是我解决这个问题的方法.
方法1:每当图像更改时URL都会更改
Glide.with(DemoActivity.this)
.load(Uri.parse("file://" + imagePath))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(mImage);
Run Code Online (Sandbox Code Playgroud)
diskCacheStrategy()可用于处理磁盘缓存,您可以使用skipMemoryCache()方法跳过内存缓存.
方法2:但是,当URL未更改时,图像会更改
如果您的URL保持不变,则需要使用签名进行图像缓存.
Glide.with(yourFragment)
.load(yourFileDataModel)
.signature(new StringSignature(yourVersionMetadata))
.into(yourImageView);
Run Code Online (Sandbox Code Playgroud)
Glide signature()使您能够将其他数据与缓存键混合使用.
MediaStoreSignature
如果要从媒体商店获取内容,则可以使用.MediaStoreSignature
允许您将日期修改时间,mime类型和媒体商店项目的方向混合到缓存键中.这三个属性可靠地捕获编辑和更新,允许您缓存媒体商店大拇指.StringSignature
将保存为文件的内容混合文件日期修改时间.Mat*_*ini 48
正如Glide wiki的缓存和缓存失效一节中所述:
因为文件名是散列键,所以没有什么好方法可以简单地删除磁盘上与特定URL或文件路径对应的所有高速缓存文件.如果您只被允许加载或缓存原始图像,问题会更简单,但由于Glide还会缓存缩略图并提供各种转换,每个转换都会在缓存中生成一个新文件,跟踪并删除每个缓存版本图像很难.
实际上,使缓存文件无效的最佳方法是在内容更改时更改您的>标识符(url,uri,文件路径等).
由于您无法更改文件路径,因此Glide提供了signature() API,允许您将一些其他数据混合到内存和磁盘缓存键中,从而允许调用者更好地控制缓存数据何时失效.
如果要在每次从磁盘映像重新加载时,可以像这样更改代码:
Glide.with(DemoActivity.this)
.load(Uri.parse("file://" + imagePath))
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
.into(mImage);
Run Code Online (Sandbox Code Playgroud)
Ana*_*ani 29
这将删除Glide存储的缓存内存.它应该在后台完成,否则会抛出异常
new Thread(new Runnable() {
@Override
public void run() {
Glide.get(MainActivity.this).clearDiskCache();
}
}).start();
Run Code Online (Sandbox Code Playgroud)
Cha*_*san 29
有两种方法可以处理Glide缓存刷新,
第一道: - 在下面添加滑行实施
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
Run Code Online (Sandbox Code Playgroud)
第二种方式:
如果您能够识别图像更改,请在下面提供新文件名,
.signature(new StringSignature(String.valueOf(fileName)))
Run Code Online (Sandbox Code Playgroud)
或者您想每次加载最新图像,请在下方使用
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
And*_*lov 19
有Glide 4.2.0的麻烦,StringSignature
没有解决.
看起来StringSignature
不再可用,你必须使用ObjectKey
.
所以代码看起来像
Glide.with(imageView).
load(pathToImage).
apply(new RequestOptions().signature(new ObjectKey("signature string"))).
into(imageView);
Run Code Online (Sandbox Code Playgroud)
Dhi*_*pta 15
如果将图像保存为与约定相同的已知文件名,并且只有在文件更改时才想使Glide缓存无效,则使用文件修改时间戳可以很好地工作.
我正在使用这样的惯性图像,我正在下载到File
Glide外的对象,然后使用Glide只是为了有效地调整大小并使它们成为圆形等.
所以我最终使用StringSignature
策略将文件的lastChanged时间戳的值作为签名.这是流畅的代码:
Glide.with(this)
.load(avatarFile)
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.signature(new StringSignature(String.valueOf(avatarFile.lastModified())))
.into(ivProfile);
}
Run Code Online (Sandbox Code Playgroud)
当然,avatarFile
我的java.io.File
对象在哪里.
Pal*_*dro 12
我使用Glide版本4.*与Kotlin设置签名时遇到了麻烦.过了一段时间我最终得到了这个:
fun ImageView.loadUrl(url: String) {
var requestOptions = RequestOptions()
requestOptions.signature(ObjectKey(System.currentTimeMillis()))
Glide.with(this).load(url).apply(requestOptions).into(this)
}
Run Code Online (Sandbox Code Playgroud)
它是ImageView的扩展函数,它以这种方式使用:
imageView.loadUrl(url)
Run Code Online (Sandbox Code Playgroud)
我希望它会帮助某人
Jay*_*ala 11
对于Glide 4.3.+库,你需要这样的东西,
Glide.with(context)
.load(image_path)
.apply(new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true))
.into(imge_view);
Run Code Online (Sandbox Code Playgroud)
在最新版本中,我们应该使用RequestOptions
RequestOptions提供类型无关的选项,以在最新版本的Glide中使用Glide自定义负载.
创建一个RequestOptions对象,并在我们加载图像时使用它.
RequestOptions requestOptions = new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE) // because file name is always same
.skipMemoryCache(true);
Glide.with(this)
.load(photoUrl)
.apply(requestOptions)
.into(profile_image);
Run Code Online (Sandbox Code Playgroud)
我为此工作了好几天,所有上述解决方案都像树懒一样慢。
我知道您之前可能读过这篇文章并忽略了它,因为您认为更改代码可能需要大量工作。但说真的,这是非常值得的。据我所知,其性能优于所有其他方法,这是 Glide 推荐的解决方案,而且您不需要跳过缓存或创建签名,因此它也可以使您的代码更干净。
从滑行:
实际上,使缓存文件失效的最佳方法是在内容更改(url、uri、文件路径等)时尽可能更改您的标识符。- https://bumptech.github.io/glide/doc/caching.html
解决方案: 当用户上传新图像时更改图像的名称。获取文件名并使用它作为示例。一旦图像 URL 发生变化,Glide 就会知道您已经更改了图像,并将相应地更新缓存。到目前为止,这给了我最好的表现。
使用时:
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
Run Code Online (Sandbox Code Playgroud)
它从不缓存图像,这确实使图像加载缓慢。您可能认为签名的性能更好,但对我来说它们似乎同样慢。
使用GlideApp签名
GlideApp.with(imageView)
.load(url)
.signature(new ObjectKey(System.currentTimeMillis()))
.placeholder(R.drawable.sky)
.error(R.drawable.sky)
.into(imageView);
Run Code Online (Sandbox Code Playgroud)
最后是 Kotlin 实现(对于片段):
Glide.with(activity)
.load(url)
.apply(RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true))
.into(myImageView)
Run Code Online (Sandbox Code Playgroud)
我正在使用 Glide 加载一个File
,这是我最终做的事情,以确保每次我的文件更改时 Glide 的磁盘缓存都无效(即使它具有相同的路径):
Glide.with(context)
.load(bitmapFile)
.signature(new ObjectKey(bitmapFile.lastModified()))
.into(imageView);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
63739 次 |
最近记录: |