gpt4 book ai didi

java - 如何使用 Picasso 指定多个后备图像?

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:28 25 4
gpt4 key购买 nike

Picasso library允许人们轻松加载图像,例如:

Picasso.with(context).load(url).into(imageview);

API 还允许指定错误图像。但是如果我想让库在放弃并显示错误图像之前先尝试三个或四个不同的URL,我该怎么办?理想情况下,将按顺序尝试这些图像,如果未加载前一个图像,则回退到下一个图像。

最佳答案

原生没有此类功能的 API。但是用一些巧妙的编码 Picasso.Target您可以轻松实现此类功能。

我将在此处添加一个未经黑客测试的快速代码,您应该可以大致了解要查找的内容。您必须进行测试,也许还要进行微调,但这应该没问题。

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);
}
}

请记住,Picasso 不持有对您放入 into(object) 中的 Target 的强引用。这意味着,Picasso 内部对此使用 Wea​​kReference。

因此,这意味着您需要在 TARGETS 中进行 self 引用,以保留对您创建的所有 MultiFallBackTarget 的引用,并允许它们在完成工作后自行删除。

关于java - 如何使用 Picasso 指定多个后备图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37295306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com