Android:Glide onStart / onResume bug

时间:2016-03-07 06:32:51

标签: android bitmap android-glide

我对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

1 个答案:

答案 0 :(得分:0)

Glide可能会重新启动onStart中的失败请求,这会触发失败,然后设置错误Drawable。要解决这个问题,你应该做两件事:

  1. 在自己调用setImageResource / setImageDrawable之前(clear()之外),始终在ViewTarget上调用onResourceReady。调用clear()会阻止Glide管理View / Target,这反过来会阻止Glide重新启动onStart中的加载。

  2. 如果您保留对Glide加载的资源的引用(通常为BitmapDrawable,则需要确保在{{1}时撤消引用调用onLoadClearedonLoadFailed方法。这与此问题没有直接关系,但在上面的代码中出现错误,如果Glide重新使用Bitmap,可能会导致奇怪的错误你引用它了。