2015-01-01 5 views
16

Ich versuche, meine Nachrichten in einem benutzerdefinierten ListView zu zeigen. Jede Nachrichten aus einigen Bilder enthalten, und ich möchteHerunterladen und Speichern von Bildern mit Picasso

1.download Bilder vom Server

2.save im lokalen Speicher

3.save Weg von Bilder in SQLite

4.show Bilder in ListView mit meinem benutzerdefinierten Adapter.

Ich habe nur Probleme mit den Schritten & . Ich kann Nachrichten vom Server erhalten und zeigen sie in meinem Listview

und zeigen Bilder aus dem Cache von unten Code in meinem Adapter hinzufügen:

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

von Picasso.with(context).load(image[position]).into(target) verwenden, nur kann ich sparen eine

Bild im Speicher.

Bitte machen Sie uns Ihre Idee ...

UPDATE: Wenn ich Code unten verwenden, nur ein Bild (letzter Index meines Bild Array) gespeichert werden!

Wie kann ich alle Bilder in Array mit diesem Code speichern ?! "Picasso.with (this) .load (Bild [i]) in (Ziel);"

@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

können Sie alternativ Lazylist oder Universal Image Loader verwenden. –

+0

werfen Sie einen Blick auf diese Antwort http://stackoverflow.com/a/27720638/1576416 –

+0

@ chet's, ich habe UIL-Bibliothek heruntergeladen, aber ich kann mein Problem damit auch nicht lösen !!! Könnten Sie mir bitte einen einfachen Code geben? –

Antwort

7

Try "Target Ziel" Definition vor zu stellen.

P.S. Hier verwende ich diesen Code und speichere Bilder gut. Danke trotzdem.

Mein Code:

 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

Diese Lösung codiert den Byte-Stream zu einer Bitmap und dekomprimiert sie anschließend in eine Datei. Ursachen für Speicherausnahmen und Verlust der Bildqualität. –

+0

LightCache und GlobalConfig nicht gefunden. –

+0

@Programmingvirus Hallo, die Codes waren nur ein Beispiel. Diese fehlenden Klassen sind jedoch vorhanden. ** 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; und ** 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 Hoffe diese Hilfe! – MewX

2

Individuelles Ziel für Foto in Telefon Galerie zu speichern.

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

obwohl dieser Beitrag alt ist, scheint die Frage noch nicht beantwortet worden zu sein. Wenn Sie Ihren Code lesen, scheint der Anruf, den Sie an Picasso tätigen, asynchron sein könnte. Sie sollten auf jeden Fall überprüfen, ob Sie die Aufgaben image.length starten, den Dateinamen bei jeder neuen Aufgabe ändern, alle Aufgaben zum Abschluss führen und den letzten Dateinamen speichern. Um dies zu lösen, sollten Sie den Target-Konstruktor überschreiben und einen Dateinamen-Parameter hinzufügen, damit er fertig ist, wenn die Aufgabe endet, in Ihrem onBitmapLoaded Listener.