使用Picasso下载并保存图像

时间:2015-01-01 10:30:01

标签: android picasso downloading

我试图在自定义 ListView 中显示新闻。每个新闻都包含在一些图片中,我想

1.从服务器下载图像

2.save in local storage

3.将图片路径保存到SQLite中

4.使用我的自定义适配器在ListView中显示图像

我对步骤 1 &的 2 即可。我可以从服务器获取新闻并在我的 ListView

中显示它们

通过在我的适配器中添加以下代码,从缓存中显示图像

Picasso.with(context).load(image[position]).into(iv);

使用Picasso.with(context).load(image[position]).into(target),我可以保存一个

存储中的

图像

请建议我你的想法......

UPDATE :当我使用下面的代码时,只保存一个图像(我的图像数组的最后一个索引)!

如何使用此代码保存数组中的所有图像?!

@Override
protected void onPostExecute(Void result) {
   SaveImages();
   pDialog.dismiss();
   super.onPostExecute(result);
}

String fileName = null;

public void SaveImages() {
    for(int i = 0; i < image.length; i++) {
        Picasso.with(this).load(image[i]).into(target);
        fileName = "image-" + i + ".jpg";
    }
}

Target target = new Target() {

    @Override
    public void onPrepareLoad(Drawable arg0) {
    }

    @Override
    public void onBitmapLoaded(Bitmap bitmap, LoadedFrom arg1) {
        File file = new File(Environment.getExternalStorageDirectory().getPath() +"/" + fileName);
         try {
             file.createNewFile();
             FileOutputStream ostream = new FileOutputStream(file);
             bitmap.compress(CompressFormat.JPEG, 75, ostream);
             ostream.close();
         } catch (Exception e) {
             e.printStackTrace();
         }
    }

    @Override
    public void onBitmapFailed(Drawable arg0) {
    }
};

3 个答案:

答案 0 :(得分:7)

尝试放置&#34;目标目标&#34;定义之前&#34; Picasso.with(this).load(image [i])。into(target);&#34;。

P.S。在这里,我使用此代码并很好地保存图像。不管怎样,谢谢。

我的代码:

        final String fileName = mDataset.get(i).getAid() + ".jpg";
        Target target = new Target() {

            @Override
            public void onPrepareLoad(Drawable arg0) {
                return;
            }

            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) {

                try {
                    File file = null;

                    // judge "imgs/.nomedia"'s existance to judge whether path available
                    if(LightCache.testFileExist(GlobalConfig.getFirstStoragePath()
                            + "imgs" + File.separator +".nomedia") == true)
                        file = new File(GlobalConfig.getFirstStoragePath()
                                + "imgs" + File.separator + fileName);

                    else file = new File(GlobalConfig.getSecondStoragePath()
                            + "imgs" + File.separator + fileName);

                    file.createNewFile();
                    FileOutputStream ostream = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, ostream);
                    ostream.close();

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onBitmapFailed(Drawable arg0) {
                return;
            }
        };

        Picasso.with(GlobalConfig.getContext())
                .load(Wenku8API.getCoverURL(mDataset.get(i).getAid()))
                .into(target);

答案 1 :(得分:2)

在手机图库中存储照片的自定义目标。

public class TargetPhoneGallery implements Target
{
    private final WeakReference<ContentResolver> resolver;
    private final String name;
    private final String desc;

    public TargetPhoneGallery(ContentResolver r, String name, String desc)
    {
        this.resolver = new WeakReference<ContentResolver>(r);
        this.name = name;
        this.desc = desc;
    }

    @Override
    public void onPrepareLoad (Drawable arg0)
    {
    }

    @Override
    public void onBitmapLoaded (Bitmap bitmap, LoadedFrom arg1)
    {
        ContentResolver r = resolver.get();
        if (r != null)
        {
            MediaStore.Images.Media.insertImage(r, bitmap, name, desc);
        }
    }

    @Override
    public void onBitmapFailed (Drawable arg0)
    {
    }
}

Picasso.with(context).load(image[position]).into(new TargetPhoneGallery(view.getContentResolver(), "image name", "image desc"));

答案 2 :(得分:1)

虽然这篇文章很老,但似乎还没有回答这个问题。 阅读你的代码,你对毕加索的调用似乎是异步的。 你应该检查,就好像是这样,你正在开始image.length任务,更改每个新任务的文件名,导致所有任务完成并保存到最后设置的文件名。 要解决这个问题,你应该覆盖Target构造函数并添加一个filename参数,以便在任务结束时准备就绪,在onBitmapLoaded监听器中。