Java 如何使用毕加索指定多个回退图像?
允许用户轻松加载图像,如:Java 如何使用毕加索指定多个回退图像?,java,android,image,picasso,Java,Android,Image,Picasso,允许用户轻松加载图像,如: Picasso.with(context).load(url).into(imageview); API还允许指定错误图像。但是,如果我想让库在放弃并显示错误图像之前先尝试三个或四个不同的URL,我该怎么办?理想情况下,这些映像将按顺序进行尝试,如果没有加载上一个映像,则返回到下一个映像。本机没有用于此类功能的API。但通过一些巧妙的编码,您可以轻松实现这些功能 我将在这里添加一个未经测试的快速黑客代码,它将让您大致了解要查找的内容。你必须进行测试,也许还需要进行微
Picasso.with(context).load(url).into(imageview);
API还允许指定错误图像。但是,如果我想让库在放弃并显示错误图像之前先尝试三个或四个不同的URL,我该怎么办?理想情况下,这些映像将按顺序进行尝试,如果没有加载上一个映像,则返回到下一个映像。本机没有用于此类功能的API。但通过一些巧妙的编码,您可以轻松实现这些功能 我将在这里添加一个未经测试的快速黑客代码,它将让您大致了解要查找的内容。你必须进行测试,也许还需要进行微调,但那应该很好
private static final List<MultiFallBackTarget> TARGETS = new ArrayList<MultiFallBackTarget>();
public static class MultiFallBackTarget implements Picasso.Target {
private WeakReference<ImageView> weakImage;
private List<String> fallbacks;
public MultiFallBackTarget(ImageView image){
weakImage = new WeakReference<>(image);
fallbacks = new ArrayList<String>();
TARGETS.add(this);
}
public void addFallback(String fallbackUrl){
fallbacks.add(fallbackUrl);
}
public void onBitmapLoaded(Bitmap bitmap, LoadedFrom from){
removeSelf();
ImageView image = weakImage.get();
if(image == null) return;
image.setImageBitmap(bitmap);
}
public void onBitmapFailed(Drawable errorDrawable){
ImageView image = weakImage.get();
if(image == null) {
removeSelf();
return;
}
if(fallbacks.size() > 0){
String nextUrl = fallbacks.remove(0);
// here you call picasso again
Picasso.with(image.getContext()).load(nextUrl).into(this);
} else {
removeSelf();
}
}
public void onPrepareLoad(Drawable placeHolderDrawable){}
private void removeSelf(){
TARGETS.remove(this);
}
}
private static final List TARGETS=new ArrayList();
公共静态类MultiFallBackTarget实现了Picasso.Target{
私人财富参考财富;
私有列表回退;
公共多回退目标(ImageView图像){
weakImage=新的WeakReference(图像);
回退=新建ArrayList();
目标。添加(本);
}
public void addFallback(字符串fallbackUrl){
fallbacks.add(fallbackUrl);
}
公共无效onBitmapLoaded(位图,从加载){
removeSelf();
ImageView image=weakImage.get();
if(image==null)返回;
setImageBitmap(位图);
}
公共无效onBitmapFailed(Drawable errorDrawable){
ImageView image=weakImage.get();
if(image==null){
removeSelf();
返回;
}
if(fallbacks.size()>0){
String nextUrl=fallbacks.remove(0);
//你又给毕加索打电话了
Picasso.with(image.getContext()).load(nextur).into(this);
}否则{
removeSelf();
}
}
public void onPrepareLoad(可提取占位符可提取){}
私有void removeSelf(){
目标。移除(此);
}
}
请记住,毕加索并没有对您放入(对象)的中的目标进行强引用。这意味着,毕加索在内部使用了WeakReference
因此,这意味着您需要在TARGETS
中使用该自引用来保留您创建的所有multicallbacktarget
的引用,并允许它们在完成工作时自删除