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
的引用,并允许它们在完成工作时自删除