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

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

1. загружать изображения с сервера

2. сохранять в локальном хранилище

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

Solutions Collecting From Web of "Загрузка и сохранение изображений с помощью Picasso"

Попробуйте установить определение «Целевая цель» до «Picasso.with (this) .load (изображение [i]). В (target);».

PS Здесь я использую этот код и хорошо сохраняю изображения. Спасибо, в любом случае.

Мой код:

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

Пользовательская цель для сохранения фотографии в телефонной галерее.

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

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