我正在尝试将图片加载到我的视图中。有时候它有效,有时则不然。我正在测试API级别19模拟器。永远不会调用新Target内部的故障块。我看到prepareLoad
,然后是:
onBitmapLoaded
被调用,图像将显示为什么会这样?
这是在模拟器上发生的。在物理设备上,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 :(得分: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);