Загрузка и сохранение изображений с помощью Picasso

Я пытаюсь показать свою новость в пользовательском ListView. Каждая новость включена в некоторые изображения, и я хочу

1.загрузка изображений с сервера

2.save в локальном хранилище

3.save путь изображений в SQLite

4.show изображения в 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) {
    }
};

Ответы

Ответ 1

Попробуйте поставить определение Target target перед вызовом Picasso.with(this).load(image[i]).into(target);

Постскриптум Используя следующий код, я очень хорошо сохранил изображения. В любом случае, спасибо.

Мой код:

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

Ответ 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"));

Ответ 3

хотя этот пост старый, кажется, вопрос еще не ответил. Читая свой код, кажется, что вызов, который вы делаете на пикассо, может быть асинхронным. Вы должны обязательно проверить, что, как будто это так, вы запускаете задачи image.length, изменяя имя файла при каждой новой задаче, заставляя все задачи заполнять и сохранять до последнего установленного имени файла. Чтобы решить эту проблему, вы должны переопределить конструктор Target и добавить параметр имени файла, чтобы он был готов к завершению задачи в вашем слушателе onBitmapLoaded.