滑动不更新相同网址的图像android?

时间:2017-01-20 07:19:49

标签: android caching imageview android-glide

我对图片有相同的网址。当我多次更新此图像时,它会显示上一张图像。服务器上的图像和图片版本已更新,但Glide未显示新图像。我希望每次都获取新图像并进行缓存。

Glide.with(context)
        .load(Constants.COPY_LINK_BASE_URL + info.getDisplayPicture())
        .placeholder(R.drawable.ic_profile).dontAnimate()
        .diskCacheStrategy(DiskCacheStrategy.SOURCE)
        .signature(new (SettingManager.getUserPictureVersion(context)))
        .into(ivUserProfilePhoto);

我可以通过更改互联网来重现这个错误,在一个互联网上,它在其他互联网上的变化图像在2或3次尝试更改图像后保持相同

10 个答案:

答案 0 :(得分:21)

//Use bellow code, it work for me.Set skip Memory Cache to true. it will load the image every time.

 Glide.with(Activity.this)
.load(theImagePath)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(myImageViewPhoto);

答案 1 :(得分:17)

Glide 4.x

Glide.with(context)
     .load(imageUrl)
     .apply(RequestOptions.skipMemoryCacheOf(true))
     .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE))
     .into(imageView);

Glide 3.x

Glide.with(context)
     .load(imageUrl)
     .skipMemoryCache(true)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

答案 2 :(得分:5)

这是一个老问题,所以我相信你现在已经解决了。但是我相信两个大型图书馆(毕加索和格莱德)现在都支持类似的东西。

Glide有自己的签名API,您可以查看: https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation

Glide.with(yourFragment)
    .load(yourFileDataModel)
    .signature(new StringSignature(yourVersionMetadata))
    .into(yourImageView);

我自己没有机会使用它,但看起来你需要调用你的API来获取元数据版本,然后再调用它来实现它。

或者,看看ETags。

祝你好运!

答案 3 :(得分:4)

第一次加载图片时,它会在本地存储在称为缓存内存(或简称缓存)的内容中。当您再次请求它时,Glide会从缓存中提取,就好像它是一个成功的请求一样。

这有很多好的理由,例如:卸载服务器,为用户保存一些数据,并通过快速响应为他们提供流畅的用户体验。

现在,关于你的问题。您需要禁用缓存以强制Glide每次请求时远程获取图像。只需执行以下操作:

Glide.with(context)
         .load(Constants.COPY_LINK_BASE_URL + info.getDisplayPicture())
         .placeholder(R.drawable.ic_profile).dontAnimate()
         .diskCacheStrategy(DiskCacheStrategy.NONE)
         .skipMemoryCache(true)
         .signature(new (SettingManager.getUserPictureVersion(context)))
         .into(ivUserProfilePhoto);

或者为每张照片使用唯一的签名。 (有点hacky,但做的伎俩)

Glide.with(context)
         .load(Constants.COPY_LINK_BASE_URL + info.getDisplayPicture())
         .placeholder(R.drawable.ic_profile).dontAnimate()
         .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
         .into(ivUserProfilePhoto);

另一种干净的方法是在您的服务器中配置图片的缓存策略并使用.diskCacheStrategy(DiskCacheStrategy.SOURCE)

进一步阅读

Glide缓存API here

答案 4 :(得分:2)

加载或更新新图片时,请使用以下内容清除Glide内存和缓存

| == |清除滑翔记忆

 Glide.get(getApplicationContext()).clearMemory();

| == | Clear Glide Cache()

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

答案 5 :(得分:2)

我的情况下,滑翔机无法识别Sub LoopOptoRun() ' ' Loop OptoRun Macro ' Dim currentPoint As Long NumberOfLoops = InputBox("How Many Lineups?") If Not IsNumeric(NumberOfLoops) Then NumberOfLoops = 1 currentPoint = 1 Do Until currentPoint > NumberOfLoops ActiveSheet.Unprotect Password:="9061" SolverOk SetCell:="$AC$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$Q$2:$Q$200", _ Engine:=2, EngineDesc:="Simplex LP" SolverOk SetCell:="$AC$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$Q$2:$Q$200", _ Engine:=2, EngineDesc:="Simplex LP" SolverSolve UserFinish:=True Range("priorProjPts").Value = Range("totProjPts").Value - 0.001 ActiveSheet.Protect Password:="9061" **Range("AH4:AH11").Select Selection.Copy Sheets("Lineup_VIEW").Select Range("A200").End(xlUp).Offset(1).Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Range("A3").Select Sheets("Optimizer").Select Application.CutCopyMode = False** currentPoint = currentPoint + 1 Loop End Sub ,因此,除了@MGDavies的answer外,您可能还需要这样的东西

.signature()

答案 6 :(得分:1)

现在滑行最新版本,您必须使用RequestOption清除缓存。

RequestOptions options = new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true);

或者对于每次加载图片,您都必须使用 String 作为signature

RequestOptions options = new RequestOptions()
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())));

最后:

Glide.with(CompressSingleActivity.this)
.applyDefaultRequestOptions(options)
.load(currentFile)
.into(currentImageView);

答案 7 :(得分:1)

Glide 4.8.0

Glide.with(mContext).asBitmap()
                    .load(nopicUrl)
                    .apply(RequestOptions.skipMemoryCacheOf(true))
                    .apply(RequestOptions.signatureOf(new ObjectKey(String.valueOf(System.currentTimeMillis()))))
                    .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.DATA))
                    .into(ivImageView);

答案 8 :(得分:0)

这好像是与Glide Library本身有关的问题,我找到了可以解决此问题的技巧,只需在图像网址后添加一个随机数作为查询,例如下面的示例代码,它可以解决我的问题,希望对您有所帮助也是

        Random random = new Random();
        int randomInt = random.nextInt();
        Glide.with(context)
                .applyDefaultRequestOptions(new RequestOptions()
                        .circleCrop().diskCacheStrategy(DiskCacheStrategy.NONE))
                .load(ConstantVars.BaseUrl + userModel.getAvatarURL() + "?" + randomInt)
                .apply(new RequestOptions().error(R.drawable.himart_place_holder))
                .into(imageViewProfile);

它将使Glide可以在您请求时重新加载图像,就像根本没有缓存可读取一样。

答案 9 :(得分:0)

尝试使用RequestOptions:

/* unvisited link */
a:link {
  color: red;
  background-color: white
}

/* visited link */
a:visited {
  color: green;
  background-color: white
}

/* mouse over link */
a:hover {
  color: hotpink;
  background-color: white
}

/* selected link */
a:active {
  color: blue;
  background-color: white
}

如果.setDefaultRequestOptions(requestOptions)不起作用,请使用.apply(requestOptions):

RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(R.drawable.ic_placeholder);
requestOptions.error(R.drawable.ic_error);

Glide.with(context)
     .setDefaultRequestOptions(requestOptions)
     .load(url).into(holder.imageView);