Autore Topic: Gestione Immagini da url  (Letto 2024 volte)

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Gestione Immagini da url
« il: 01 Agosto 2011, 19:31:55 CEST »
0
ciao a tutti! cercherò di essere più chiaro possibile, essendo nuovo ad android e provando per la prima volta determinate operazioni!!

sto realizzando una piccola applicazione che scarica delle immagini da degli url, che a loro volta vengono poi inserite in una scrollview orizzontale con la possibilità di essere cliccate e settate come wallpaper, salvate su SD etc.

-le Imageview le inserisco tramite un metodo che ho creato(quindi in via programmatica), usando un ciclo for( che legge la lista degli url e crea tante piccole thumbs quanti sono appunto gli url(che per adesso sono 10).

-All'interno del ciclo, per ogni valore viene aggiunta la view, e scaricato l'url corrispondente.. e cosi via fino al termine.

Il problema è che quando avvio il metodo all'interno di onCreate, occorrono circa 15 secondi affinchè venga caricata l'applicazione.
Ho provato con un progress dialog, ma non sembra funzionare.
Magari lanciare uno splashscreen,aprire una nuova finestra, un logo che rimanga fino a quando il tutto non è caricato.
Dovrei insomma creare una finestra che permetta all'applicazione di avviarsi subito,permettendo nel frattempo il caricamento stesso degli url(la lentezza sta appunto nei download).

Sto solo supponendo, sarei felicissimo di avere una vostra dritta su questo problema

Grazie mille
Sergio


Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Gestione Immagini da url
« Risposta #1 il: 01 Agosto 2011, 19:35:25 CEST »
+1
Per risolvere devi necessariamente effetturare il download in un thread separato. Per fare questo puoi usare ad esempio un http://developer.android.com/reference/android/os/AsyncTask.html ;)

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Gestione Immagini da url
« Risposta #2 il: 01 Agosto 2011, 20:45:22 CEST »
0
grazie mille ricky :-) :-) quando pensi che sei arrivato, arriva subito un altro problema da risolvere e altro da imparare!!!
la vedo dura.... ma mi studio ben bene il link e vediamo cosa riesco a fare!

Sergio

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Gestione Immagini da url
« Risposta #3 il: 01 Agosto 2011, 22:34:37 CEST »
0
Ho inserito la classe asynctask....l'utilizzo dovrebbe essere abbastanza intuitivo...
ad ogni modo sembra il thread principale e questo vadano in conflitto (solamente quando do l'istruzione per il download)

posto il logcat:

Codice (Java): [Seleziona]
08-01 22:28:29.411: ERROR/AndroidRuntime(24318): FATAL EXCEPTION: AsyncTask #1
08-01 22:28:29.411: ERROR/AndroidRuntime(24318): java.lang.RuntimeException: An error occured while executing doInBackground()
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at java.lang.Thread.run(Thread.java:1102)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.view.ViewRoot.checkThread(ViewRoot.java:2824)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.view.ViewRoot.requestLayout(ViewRoot.java:598)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.view.View.requestLayout(View.java:8126)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.view.View.requestLayout(View.java:8126)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.view.View.requestLayout(View.java:8126)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.view.View.requestLayout(View.java:8126)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.view.View.requestLayout(View.java:8126)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.widget.TextView.checkForRelayout(TextView.java:5451)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.widget.TextView.setText(TextView.java:2699)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.widget.TextView.setText(TextView.java:2567)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.widget.TextView.setText(TextView.java:2542)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at com.android.test.wallp.wallpap$InitTask.doInBackground(wallpap.java:327)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at com.android.test.wallp.wallpap$InitTask.doInBackground(wallpap.java:1)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-01 22:28:29.411: ERROR/AndroidRuntime(24318):     ... 4 more

è questa è la parte incriminata:

Codice (Java): [Seleziona]
  @Override
                    protected String doInBackground(Context... params )
                   {  
                     num_url=0;
                     int i = mLinks.length;
                         for (int x = 0; x < i; ++x)
                         {
                       if(isWifi)
                        {                
                        Bitmap bm=(LoadImageFromWeb(getLinkId(num_url),bmOptions));///esattamente attivando questo va in crash

                    .............resto del codice..............

continuo a tenervi informato se riesco a risolvere quest'altro rompicapo

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Gestione Immagini da url
« Risposta #4 il: 01 Agosto 2011, 22:43:44 CEST »
0
Bisognerebbe vedere che fanno i metodi che chiami in quella riga.

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Gestione Immagini da url
« Risposta #5 il: 01 Agosto 2011, 23:09:51 CEST »
0
si ricky hai ragione... a me sembrano davvero due metodi abbastanza elementari

 
Codice (Java): [Seleziona]
public Bitmap LoadImageFromWeb(String url,BitmapFactory.Options options)
                  {    
                   Bitmap bitmap = null;
                   InputStream is = null;    
                    try
                    {                          
                  is = OpenHttpConnection(url);
                  bitmap = BitmapFactory.decodeStream(is, null, options);
          is.close();
                     }             
                    catch (Exception e) {
                   System.out.println("Exc="+e);
                   return null;
                  }
                   return bitmap;              
        }      

il getLinkId(num_url) ritorna una stringa che è l'url ad una determinata posizione( ho costruito una piccola lista di url)

 
Codice (Java): [Seleziona]
public String getLinkId(int position) {
                    return mLinks[position];//ritorna la stringa in base alla posizione            
                }

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Gestione Immagini da url
« Risposta #6 il: 02 Agosto 2011, 00:09:59 CEST »
0
Credo che il problema non sia quella riga, ma in qualche metodo che usi nel doInBackground e che va a modificare l'UI. Per esempio: usi un qualche setImageBitmap() all'interno del doInBackground?

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Gestione Immagini da url
« Risposta #7 il: 02 Agosto 2011, 00:47:03 CEST »
0
sicuramente è qualcosa a che vedere con qualche view.. anche se non è inserito nulla qui.
se rendo attiva la riga "  Bitmap bm=(LoadImageFromWeb(getLinkId(num_url),bmOptions));  " allora va in crash..
ho creato un piccolo ciclo, proprio perchè volevo far fare un download di tutti gli url inseriti in lista      

Codice (Java): [Seleziona]
public class InitTask extends AsyncTask<Context, Integer, String>
          {                            
          ConnectivityManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);       
      Boolean isWifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();
           
         @Override
                    protected String doInBackground(Context... params )
                   {               
                  num_url=0;           
                  int u = mLinks.length; //lunghezza lista url
                  for (int x = 0; x < u; ++x)
                    {
               if(isWifi)
                        {
                     infotext.setText("WiFi acceso");  
                   //  Bitmap bm=(LoadImageFromWeb(getLinkId(num_url),bmOptions));               
                         } else{
                       infotext.setText("Wifi disattivato");             
                           }     
                           num_url = num_url+1;  
                   }
                         Log.i( "testsync", "ok!" );
                                return "COMPLETE!";
                                       
                   }   

la cosa curiosa è che se tolgo il ciclo for e attivo la riga del bitmap... il sistema non crasha

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Gestione Immagini da url
« Risposta #8 il: 02 Agosto 2011, 00:50:49 CEST »
+1
Il problema sono i due metodi Infotext.setText(). Vanno a modificare l'interfaccia dell'activity, e questo non può essere fatto in background. Se provi a toglierli entrambi, dovrebbe funzionare tutto, a patto che non ci siano altre modificazioni dell'interfaccia nel resto del codice. :)

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Gestione Immagini da url
« Risposta #9 il: 02 Agosto 2011, 00:57:59 CEST »
0
esatto! la cosa che mi aveva portato fuori strada, era il fatto che se disattivavo:

Bitmap bm=(LoadImageFromWeb(getLinkId(num_url),bmOptions));     

allora le textView venivano visualizzate!
adesso ho disattivato le textView e il sistema non crasha! è un bel passo avanti per me:)

Quindi è vietato modificare l'interfaccia principale, questo deve essere fatto in pre o postExecute..
Continuo i miei "esperimenti"!

Sergio

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Gestione Immagini da url
« Risposta #10 il: 02 Agosto 2011, 01:03:56 CEST »
+1
Volendo puoi farlo nel metodo onProgressUpdate().
Basta che aggiungi il metodo onProgressUpdate(String...messaggio) all'asyncTask, con all'interno un infotext.setText(messaggio). Dal doInBackground, quando vuoi cambiare il testo dell'infotext, basta che richiami il metodo publishProgress("wifi acceso").

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Gestione Immagini da url
« Risposta #11 il: 02 Agosto 2011, 11:23:04 CEST »
0
grazie Verandi e Ricky per le dritte.. tutto è andato liscio e ho fatto semplicemente la seguente cosa:

-inserito la funzione di download nel metodo doInBackground():

-al metodo onProgressUpdate() ho lasciato il compito di aggiungere man mano le varie imageview e assegnare il bitmap appena scaricato.

il risultato è come speravo.. inserisce ad una ad una le imageviews, via via che il programma scarica il bitmap assegnato

topic da considerare risolto!
Sergio