使用Picasso加载图像并不总是显示

时间:2016-11-08 00:32:28

标签: android picasso

我正在尝试将图片加载到我的视图中。有时候它有效,有时则不然。我正在测试API级别19模拟器。永远不会调用新Target内部的故障块。我看到prepareLoad,然后是:

  1. onBitmapLoaded被调用,图像将显示
  2. 图片无法显示
  3. 为什么会这样?

    这是在模拟器上发生的。在物理设备上,Q& A报告了100%的故障率。在其他设备上,我看到间歇性故障率。这是怎么回事?

    public void setBackground() {
        final LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main_layout);
    
        final Context context = this;
        final String imagePath = getStore().backgroundImageURI;    
    
        if (getStore().backgroundImageNumber > 0) {
            mainLayout.setBackground(context.getResources().getDrawable(getStore().backgroundImageNumber));
            return;
        }
        if (imagePath == null) {
            mainLayout.setBackground(context.getResources().getDrawable(R.drawable.sk_collection_bg_default));
            return;
        }
        Picasso.with(this).load(imagePath).into(new Target(){
            @Override
            public void onBitmapLoaded(Bitmap bitmap, LoadedFrom from) {
                Log.v("Biscuit-width", String.valueOf(bitmap.getWidth()));
                Log.v("Biscuit-height", String.valueOf(bitmap.getHeight()));
    
                mainLayout.setBackground(new BitmapDrawable(context.getResources(), bitmap));
            }
    
            @Override
            public void onBitmapFailed(final Drawable errorDrawable)
            {
                Log.d("BISCUIT", "FAILED" + errorDrawable.toString());
    
            }
    
            @Override
            public void onPrepareLoad(final Drawable placeHolderDrawable) {
                Log.d("TAG", "Prepare Load");
            }
        });
    }
    

2 个答案:

答案 0 :(得分:2)

我有一段时间没有使用过毕加索,但是当天回来,目标是WeakReferences,你必须对它进行一次严格的引用(请原谅我,如果情况不再如此,但杰克沃顿是非常坚定地认为,你必须保持一个很难的参考或目标将是垃圾收集"事情;可能是因为他被问了同样的事情超过9000次(包括我自己)。

那么看看这个堆栈溢出响应看起来是同样的问题......

https://stackoverflow.com/a/26918731/2684

  

正如其他受访者(@lukas和@mradzinski)所指出的那样,毕加索只保留对Target对象的弱引用。虽然您可以在其中一个类中存储强引用Target,但如果Target以任何方式引用View,这仍然会有问题,因为您也有效地保留了对该View的强引用(这是毕加索明确帮助你避免的事情之一。)

     

如果您处于这种情况,我建议您将目标标记为视图。

答案 1 :(得分:0)

我也面临这个问题,你应该像毕加索一样使用......

Picasso.Builder builder = new Picasso.Builder(this);
        builder.listener(new Picasso.Listener()
        {
            @Override
            public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception)
            {
                exception.printStackTrace();
            }
        });
        builder.build().load(imgURL)
        .placeholder(R.drawable.ic_launcher)
        .into(imageIMG);