2014-07-18 13 views
5

sto usando la libreria Picasso per scaricare le immagini da URL. Questo è il mio primo tentativo su PicassoDownload delle immagini multiple da Picasso in Android

Scenario: Voglio scaricare alcune immagini dal server e memorizzarle in un file. So come archiviare in file e recuperare. Quando ho eseguito il codice qui sotto, capisco che sto ricevendo solo l'ultima immagine. Sembra che Picasso funzioni parallelamente. L'ho verificato visualizzando un messaggio di brindisi. Esiste comunque la soluzione a questo problema?

Problema: sto ricevendo solo l'ultima immagine URL.

Ecco il mio codice

static int count = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    for (int i = 0; i < url.length; i++) 
    { 

     // url is String array which has 2 urls. 
     ++count; // Incrementing the count by 1 
     Picasso.with(this).load(url[i]) 
     .into(new Target() { 

      @Override 
      public void onPrepareLoad(Drawable arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onBitmapLoaded(Bitmap arg0, LoadedFrom arg1) { 
       // TODO Auto-generated method stub 
       arg0 = Bitmap.createScaledBitmap(arg0, 150, 150, true); 
       filePath = saveFile(arg0); // I'm just calling this function to check how many times `onBitmapLoaded` is called. And it is called only once...!! 
      } 

      @Override 
      public void onBitmapFailed(Drawable arg0) { 
       // TODO Auto-generated method stub 

      } 
     }); 
    } 
} 

public String saveFile (Bitmap bm) 
{ 

    Toast.makeText(getApplicationContext(), ""+count, 100).show(); // Displaying the value of count, which always display as **2**. 
    return ""; 
} 
+0

Sì, mostrano sempre contare 2 becz quando la vostra prima immagine bitmap caricata al conteggio del tempo ha raggiunto il valore 2 in iterazione. –

+0

Hai assolutamente ragione. Grazie @Haresh. Quindi posso salvare molte immagini in file con questo codice? – Aniruddha

+0

ho pubblicato ans ora è possibile controllare e più chiaro su di esso. –

risposta

3

provare in questo modo, spero che questo vi aiuterà a risolvere il tuo problema.

static int count = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    for (int i = 0; i < url.length; i++) 
    { 

     // url is String array which has 2 urls. 
     Picasso.with(this).load(url[i]) 
     .into(new Target() { 

      @Override 
      public void onPrepareLoad(Drawable arg0) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onBitmapLoaded(Bitmap arg0, LoadedFrom arg1) { 
       // TODO Auto-generated method stub 
       arg0 = Bitmap.createScaledBitmap(arg0, 150, 150, true); 
       ++count; // Incrementing the count by 1 
       filePath = saveFile(arg0); // I'm just calling this function to check how many times `onBitmapLoaded` is called. And it is called only once...!! 
      } 

      @Override 
      public void onBitmapFailed(Drawable arg0) { 
       // TODO Auto-generated method stub 

      } 
     }); 
    } 
} 

public String saveFile (Bitmap bm) 
{ 

    Toast.makeText(getApplicationContext(), ""+count, 100).show(); // Displaying the value of count, which always display as **2**. 
    return ""; 
} 
+4

Dovresti usare un thread dedicato e usare '.get()', non '.into()' per questo. –

0

Non utilizzare il metodo in questo modo piuttosto effettuare una chiamata e, a seconda della risposta chiamata alla chiamata successiva. Come metodo1 -> errore(), risultato

Gestire l'elenco di URL su entrambi e chiamare lo stesso metodo.

+0

Scusa, non ti ho preso. Puoi per favore esporre? O uno pseudocodice? – Aniruddha

1

Picasso.with (MainActivity.this) .load (Uri.parse (card.getField ("profile_picture_url"))) in (viewHolder.tvPersence).;

uso di questo codice nel metodo GetView().

3

Questa è la risposta perfetta e ho testato e funziona come un fascino. È necessario utilizzare un thread dedicato per recuperare più immagini dalla rete.

private class loadImg extends AsyncTask<Void,Integer,Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       for(int i=0;i<mAdapter.getItemCount();i++){ 
        Object object = mAdapter.getItem(i); 
        final String link = object.getImageLink();//"YOUR IMAGE LINK OR STRING"; 
        if(link!=null && !link.isEmpty()) { 
         Bitmap bitmap = Picasso.with(context).load(link).get(); 
         publishProgress(i); 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      mAdapter.notifyItemChanged(values[0]); 
      super.onProgressUpdate(values); 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
     } 

Chiama il tuo AsyncTask in qualsiasi punto del thread principale.

new loadImg().execute; 
0

Picasso.with (contesto) .load (url) .into (ImageView);

in questa immagine approccio di carico è dipende dalla velocità della vostra connessione internet per scaricare l'immagine ..

0
final ImageView iv = new ImageView(context); 

    Picasso.with(context).load(resultImageUrl).into(iv, 
     new Callback() { 
      @Override 
      public void onSuccess() { 
       // Picasso successfully loaded image from resultImageUrl 

       Bitmap bitmap = ((BitmapDrawable) 
       iv.getDrawable()).getBitmap(); 

       ImageStorage.saveToSdCard(context, bitmap, imageName); 

       onFinishDownloading(results); 
      } 

      @Override 
      public void onError() { 
       // Picasso has failed to load image from resultImageUrl 

       onFinishDownloading(results); 
      } 
    }); 
Problemi correlati