2015-01-01 3 views
16

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

1.download изображений с сервера

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

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

4.show images в ListView с помощью моего адаптера.

Я просто проблема с шагами & . Я могу получить новости с сервера и показать их в моей ListView

и показать изображения из кэша, добавьте ниже код в моем адаптере:

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

С помощью Picasso.with(context).load(image[position]).into(target), только я могу спасти 1

изображение на складе.

Пожалуйста, предложите мне вашу идею ...

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

Вы можете использовать лазилист или универсальный загрузчик изображений в качестве альтернативы. –

+0

взгляните на этот ответ http://stackoverflow.com/a/27720638/1576416 –

+0

@ chet's, я загрузил библиотеку UIL, но я тоже не могу решить свою проблему !!! Не могли бы вы дать мне простой код? –

ответ

7

Попытка поставить "целевой Target" определение, прежде чем "Picasso.with (это) .load (изображение [я]) в (цели);.".

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

Это решение кодирует поток байтов в растровое изображение, затем декодирует рекомпрессирует его в файл. Вызывает исключения из памяти и потери качества изображения. –

+0

LightCache и GlobalConfig не найдены. –

+0

@Programmingvirus Привет, коды были всего лишь образцом. Однако эти отсутствующие классы существуют, ** LightCache **: https://github.com/MewX/light-novel-library_Wenku8_Android/blob/master/studio-android/LightNovelLibrary/app/src/main/java/org/ mewx/wenku8/util/LightCache.java; и ** GlobalConfig **: https://github.com/MewX/light-novel-library_Wenku8_Android/blob/master/studio-android/LightNovelLibrary/app/src/main/java/org/mewx/wenku8/global/GlobalConfig .java Надеюсь, что эта помощь! – MewX

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

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

Смежные вопросы