通过Picasso下载图像有时会失败

时间:2017-09-18 13:44:58

标签: android picasso

我正在使用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");

1 个答案:

答案 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);