我对Glide有一个奇怪的错误,我不知道该怎么做。基本上我有这个功能,它从reddit.com/r/earthporn /
加载图像newsdata.data.children [position] .data.url是一个网址列表
public void displayImage(final int position) {
Drawable d = view.getContext().getResources().getDrawable(R.drawable.ic_collections_white_24dp);
System.out.println(newsData.data.children[position].data.url);
Glide.with(view.getContext())
.load(newsData.data.children[position].data.url)
.asBitmap()
.listener(new RequestListener<String, Bitmap>() {
@Override
public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
displayImage(position + 1);
//todo: make sure we don't run into a index out of bounds.
return false;
}
@Override
public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
return false;
}
})
.centerCrop()
.error(d)
.into(new BitmapImageViewTarget(view.getImageView()) {
@Override
protected void setResource(Bitmap resource) {
super.setResource(resource);
view.setImageBitmap(resource);
wallPaperBitmap = resource;
System.out.println(resource);
}
});
}
Android无法加载subreddit上显示的每张图片。当发生这种情况时,我会加载下一个图像。在今天的运行中,它会加载此图片http://imgur.com/HOSg2FC,调用异常,然后加载此http://i.imgur.com/baluFH7.jpg
OnCreate,此代码将按预期运行。它运行,命中异常,再次调用displayImages()并设置正确的Image。 (请告诉我,如果有更好的方法可以做到这一点)
OnResume / onStart是问题所在。代码将运行,命中异常,放置错误drawable,再次调用displayImages但不更改imageview。 setResource(位图资源)也会给我正确的位图,但不会让我更新imageview。
基本上,它会将图像视图冻结为错误可绘制,或者如果没有可绘制的则将其冻结到空白的白色屏幕,并且不允许我更改它。
使用以下代码调用onResume:
if(wallPaperBitmap != null) {
view.setImageViewPicture(wallPaperBitmap);
//view.showButtons();
System.out.println("bitmap != null");
}
else {
retrieveImage(SubReddit.Earth);
System.out.println("bitmap = null");
}
将设置正确的图片。
我想也许这可能是缓存的问题,所以我尝试使用diskcachestrategy.none,但这也没有帮助。作为最后的手段,一旦使用更新的位图调用setResource或者只使用Picasso,我可能会刷新屏幕,但我宁愿避免这种情况。
感谢任何帮助!
编辑:我也得到错误:D / skia:--- SkImageDecoder :: Factory返回null onStart
答案 0 :(得分:0)
Glide可能会重新启动onStart中的失败请求,这会触发失败,然后设置错误Drawable。要解决这个问题,你应该做两件事:
在自己调用setImageResource / setImageDrawable之前(clear()
之外),始终在View
和Target
上调用onResourceReady
。调用clear()
会阻止Glide管理View
/ Target
,这反过来会阻止Glide重新启动onStart中的加载。
如果您保留对Glide加载的资源的引用(通常为Bitmap
或Drawable
,则需要确保在{{1}时撤消引用调用onLoadCleared
或onLoadFailed
方法。这与此问题没有直接关系,但在上面的代码中出现错误,如果Glide重新使用Bitmap,可能会导致奇怪的错误你引用它了。