2016-11-08 72 views
2

我试图将图像加载到我的视图中。有时它起作用,有时它不起作用。我正在API级别19模拟器上测试。新的Target内部的故障块永远不会被调用。我看到prepareLoad,然后或者:加载毕加索的图像并不总是显示

  1. onBitmapLoaded被调用时,图像会显示
  2. 图像不会显示

为什么会这样发生?

这发生在模拟器上。在物理设备上,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"); 
     } 
    }); 
} 

回答

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); 
+0

我没有看到任何异常记录 – quantumpotato

1
我没有使用过毕加索一段时间,但早在一天

,目标是在WeakReferences,和你必须保持一个很好的参考(如果情况不是这样的话,请原谅我,但是杰克·沃顿对于“你必须坚持一个很难的参考或目标将被垃圾收集”)是非常坚定的;可能是因为他被问到了同样的东西超过9000次(包括我自己)

所以看看这个堆栈溢回应似乎是同样的问题...

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

正如其他受访者(@lukas和@mradzinski),毕加索只有保持一个弱引用到目标对象注意。虽然您可以在您的某个类中存储强大的参考目标,但如果目标以任何方式引用视图,这仍然会有问题,因为您还将有效地保持对该视图的强烈引用(这是毕加索明确帮助你避免的事情)。

如果你在这种情况下,我建议标记目标视图。

+0

所以我需要做的就是在我的Activity中保留一个Target作为成员变量,并引用它? – quantumpotato

+0

是的,例如。 :) –

+1

保存我的一天。请接受这个答案,这真的很有用 –