我正在使用Picasso从网上下载图片,但有时会有效,有时会失败。这非常恼人,我无法找到解决这个问题的方法。有什么帮助吗?
我下载图片的代码:
public void imageDownload(Context ctx, String url){
Picasso.with(ctx)
.load(spp)
.into(getTarget(url));
}
//Using the Picasso Target Class
private Target getTarget(String url){
final String temp = url;
Target target = new Target(){
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
new Thread(new Runnable() {
@Override
public void run() {
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + temp);
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, ostream);
ostream.flush();
ostream.close();
} catch (IOException e) {
Log.e("IOException", e.getLocalizedMessage());
}
}
}).start();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
return target;
}
我将此方法称为:
imageDownload(getActivity(),"image.jpg");
答案 0 :(得分:0)
从方法文档到(目标t):
注意:此方法保留对{@link Target}的弱引用 实例,如果你不保留,将被垃圾收集 强烈提及它。在图像时接收回调 加载使用{@link #into(android.widget.ImageView,Callback)}
您没有保留对您创建的Target实例的引用,因此可以通过垃圾收集器收集文档状态。这可以解释您观察到的随机行为。
文档中提出了一个解决方案(使用到(android.widget.ImageView,Callback))。
另一种解决方案是保留对Target实例的引用。
target = getTarget(url); //declared as a field of a class
Picasso.with(ctx)
.load(spp)
.into(target);