我知道这个论坛已经满了#34; Android没有显示图像"问题,但它们似乎都没有与我所经历的一致。
当我使用调试器并逐步执行我的代码时,它工作正常并显示图像。但是当我不停止代码时,它根本不会更新图像,或者它会在以后更新它。
这看起来Android并没有使视图无效,但添加invalidate()也无济于事。有什么想法吗?
以下是代码:
Picasso.with(getContext()).load(url).into(new Target() { // using Picasso to load the image
@Override public void onPrepareLoad(Drawable placeHolderDrawable) {
}
@Override public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
screenSurface.setImageBitmap(bitmap); // trying to display it, screenSurface is the ImageView
// I tried adding screenSurface.invalidate() here but it doesn't help
}
@Override public void onBitmapFailed(Drawable errorDrawable) {
}
});
因为它看起来这是Android的问题,而不是毕加索,因为Picasso似乎在UI线程上发出回调。否则,在调试过程中也不会显示图像。
答案 0 :(得分:1)
你的目标正在收集垃圾。请参阅此答案以获得解释(搜索的第一个结果):https://stackoverflow.com/a/24602348
答案 1 :(得分:0)
我对毕加索并不熟悉,但这个装载机对于Volley的ImageLoader来说非常熟悉。
仔细检查,但我想Picasso.LoadedFrom param要么意味着它是从缓存加载的,要么是从服务器加载的。看看这里:Picasso.LoadedFrom docs
也许在您的代码中,您可以拥有以下内容:
switch(Picasso.LoadedFrom.valueOf(from)) {
case NETWORK:
screenSurface.setImageBitmap(bitmap);
break;
case DISK:
//Do something
break;
case MEMORY:
//Do something
break;
}
或者在加载时可能只有一个简单的if(from network) {setBitmap} else {show loading image}
类型的东西。
希望这有帮助!
答案 2 :(得分:0)
由于您的目标只是一个标准的图片视图,我建议使用基本的into(ImageView)
方法:
Picasso.with(getContext()).load(url).into(screenSurface);
如果由于某种原因需要使用自定义目标,则文档建议将该界面添加到自定义视图,而不是创建裸露的Target类。
答案 3 :(得分:0)
我前段时间遇到了类似的问题,并指出某个目标是收集了垃圾,没有断点就没有触发回调,我不得不使用一个字段来阻止目标,一切都很顺利。所以,创建一个目标字段
public Target target = new Target(){...}
然后
Picasso.with(getContext()).load(url).into(target);