2017-09-18 2 views
0

Ich verwende Picasso, um Bilder aus dem Internet herunterzuladen, aber manchmal funktioniert es und manchmal schlägt es fehl. Es ist sehr irritierend und ich kann keinen Weg finden, das zu beheben. Irgendeine Hilfe?Das Herunterladen von Bildern über Picasso schlägt manchmal fehl

Mein Code Bild zum Download:

public void imageDownload(Context ctx, String url){ 
    Picasso.with(ctx) 
      .load(spp) 
      .into(getTarget(url)); 

} 

//Using the Picasso Target Class 

private Target getTarget(String url){ 
    final String temp = url; 
    Target target = new Target(){ 

     @Override 
     public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { 
      new Thread(new Runnable() { 

       @Override 
       public void run() { 

        File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + temp); 
        try { 
         file.createNewFile(); 
         FileOutputStream ostream = new FileOutputStream(file); 
         bitmap.compress(Bitmap.CompressFormat.JPEG, 80, ostream); 
         ostream.flush(); 
         ostream.close(); 
        } catch (IOException e) { 
         Log.e("IOException", e.getLocalizedMessage()); 
        } 
       } 
      }).start(); 

     } 

     @Override 
     public void onBitmapFailed(Drawable errorDrawable) { 

     } 

     @Override 
     public void onPrepareLoad(Drawable placeHolderDrawable) { 

     } 
    }; 
    return target; 
} 

ich diese Methode als nennen:

imageDownload(getActivity(),"image.jpg"); 
+0

Was meinen Sie mit "es scheitert". Irgendwelche Fehler? Alles in Logcat? –

+0

Keine Fehler. Es speichert nur keine Dateien und manchmal auch –

Antwort

0

aus Dokumentation von Verfahren in (Target t):

Hinweis: Diese Methode behält einen schwachen Verweis auf die {@link Target} Instanz und wird als Müll gesammelt, wenn Sie keinebehaltenstarke Bezugnahme darauf. Um Rückrufe zu erhalten, wenn ein Bild ist loaded Verwendung {@link #into (android.widget.ImageView, Rückruf)}

Sie keinen Verweis auf die Instanz von Target halten Sie erstellt haben, so kann es sein, gesammelt von Garbage Collector als Dokumentation Staaten. Dies kann zufälliges Verhalten erklären, das Sie beobachtet haben.

Eine Lösung wird in der Dokumentation vorgeschlagen (in (android.widget.ImageView, Callback) verwenden).

Eine andere Lösung besteht darin, einen Verweis auf eine Instanz von Target beizubehalten.

target = getTarget(url); //declared as a field of a class 
Picasso.with(ctx) 
      .load(spp) 
      .into(target); 
Verwandte Themen