Autore Topic: Maps all'interno di un thread  (Letto 1295 volte)

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Maps all'interno di un thread
« il: 17 Ottobre 2010, 12:03:43 CEST »
0
Ciao a tutti,
io e un mio amico stiamo progettando un app che tramite le coordinate presenti su un db mysql, visualizzi la posizione di un altro utente in real-time...
il mio problema è che durante l'esecuzione delle 2 query sul db mysql (query di update sul db delle mie coordinate e query di select per prendere le coordinate di un altro utente) la mappa si pianti (non va in crash, semplicemente si freeza) per qualche secondo, rendendo quasi ingestibile l'applicazione...
mi chiedevo se gestire la visualizzazione della mappa in un thread potesse essere una soluzione...e se si, come implementarla??
vorrei ricordare che le 2 query vengono eseguite in 2 handler separati rispettivamente a 8 e 16 secondi di timer...

Spero possiate aiutarmi
Grazie
TimeReport: your time. In your pocket.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Maps all'interno di un thread
« Risposta #1 il: 17 Ottobre 2010, 12:09:30 CEST »
0
1)Mappa nel thread della gui
2)Aggionamento/query db in un asynctask: [facile] Aggiornare la UI da una Thread - Android Developers Italia

:)

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:Maps all'interno di un thread
« Risposta #2 il: 17 Ottobre 2010, 12:17:59 CEST »
0
1)Mappa nel thread della gui
2)Aggionamento/query db in un asynctask: [facile] Aggiornare la UI da una Thread - Android Developers Italia

:)

Grazie!!!  :-)
ma credi che la mappa vada inserita necessariamente in un thread?
e poi una volta creato il thread (esempio Thread maps=new Thread(); e poi maps.start(); nell activity) come faccio ad agganciarmi al satellite GPS nella stessa activity premendo un pulsante??

Ti ringrazio ancora!!  8-)
TimeReport: your time. In your pocket.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Maps all'interno di un thread
« Risposta #3 il: 17 Ottobre 2010, 12:22:58 CEST »
0
ma credi che la mappa vada inserita necessariamente in un thread?
e poi una volta creato il thread (esempio Thread maps=new Thread(); e poi maps.start(); nell activity) come faccio ad agganciarmi al satellite GPS nella stessa activity premendo un pulsante??

No il Thread della gui è quello principale, non devi creato tu manualmente :)
Il paradigma è quello solito. Gestione della UI nel thred principale *sempre*, gestione di operazioni che durano più di 100ms(quindi qualsiasi accesso alla rete) in un thread separato. L'asynctask è comodo perchè non ti devi neanche preoccupare di scrivere handler per aggiornare la UI una volta che il thread di lavoro ha finito.

Tra l'altro nel tuo caso è strano che non venga visualizzata la tipica schermata di ANR:



Designing for Responsiveness | Android Developers

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:Maps all'interno di un thread
« Risposta #4 il: 17 Ottobre 2010, 12:29:48 CEST »
0
No il Thread della gui è quello principale, non devi creato tu manualmente :)
Il paradigma è quello solito. Gestione della UI nel thred principale *sempre*, gestione di operazioni che durano più di 100ms(quindi qualsiasi accesso alla rete) in un thread separato. L'asynctask è comodo perchè non ti devi neanche preoccupare di scrivere handler per aggiornare la UI una volta che il thread di lavoro ha finito.

Tra l'altro nel tuo caso è strano che non venga visualizzata la tipica schermata di ANR:



Designing for Responsiveness | Android Developers

infatti mi esce!!! hai ragione!!  O:-)
dal quel che ho capito inizializzo la mappa nell activity normalmente e senza l'uso dei thread (metodo run() per intenderci) e mi dici che utilizzando l'asynctask le operazioni di query verranno fatte in background senza compromettere l'usabilità della mappa giusto??  :-)

se così fosse devo offrirti da bere...  :D
TimeReport: your time. In your pocket.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Maps all'interno di un thread
« Risposta #5 il: 17 Ottobre 2010, 12:39:21 CEST »
0
infatti mi esce!!! hai ragione!!  O:-)
dal quel che ho capito inizializzo la mappa nell activity normalmente e senza l'uso dei thread (metodo run() per intenderci) e mi dici che utilizzando l'asynctask le operazioni di query verranno fatte in background senza compromettere l'usabilità della mappa giusto??  :-)

Si esatto.
Puoi anche intercettare l'eventuale chiusura dell'activity e stoppare il thread in background.

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:Maps all'interno di un thread
« Risposta #6 il: 17 Ottobre 2010, 12:41:01 CEST »
0
Si esatto.
Puoi anche intercettare l'eventuale chiusura dell'activity e stoppare il thread in background.

questo forum spacca davvero troppo.  8-)
direi che posso mettere risolto :D

grazie mille, davvero!!!
TimeReport: your time. In your pocket.

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:Maps all'interno di un thread
« Risposta #7 il: 17 Ottobre 2010, 14:59:26 CEST »
0
Si esatto.
Puoi anche intercettare l'eventuale chiusura dell'activity e stoppare il thread in background.

Ricky scusa una cosa...secondo te è corretta questa parte di codice? perchè provandola non vedo differenze...sicuramente sbaglio io qualcosa...ogni query deve essere eseguita ogni 8 secondi...

Codice (Java): [Seleziona]
private class LoadingStuffTask extends AsyncTask<String, String, String> {
        // I tre tipi da dichiarare sono relativamente (in questo caso usiamo solo stringhe)
        // il parametro in entrata di doInBackground  (quando chiamiamo execute passiamo una stringa)
        // il paramentro in entrata di onProgressUpdate (dati che vogliamo mostrare all' utente -opzionale,potremmo usare variabili globali-)
        // il parametro in entrata di onPostExecure (una volta finito il task, potremmo voler mostrare un risultato all'utente)
        // nel caso non volessimo usare parametri di alcun genere tipizziamo con Void,Void,Void (passeremo poi dei null come parametri)

        @Override
        protected String doInBackground(String... params) {
                // stringa passata a onProgressUpdate

                Random rand = new Random();

                while (rand.nextInt(1000000) != 2) {
                }
                //handler per la query di update delle mie coordinate
                handler.postDelayed(update_position, 8000);
                while (rand.nextInt(1000000) != 1) {
                }
                //handler per la select delle coordinate di un altro utente
                handler2.postDelayed(see_friends, 8000);
                return "Finish !";
                // stringa passata a onPostExecute
        }

        @Override
        protected void onProgressUpdate(String... values) {
               
        }

        @Override
        protected void onPostExecute(String result) {
               
        }

}
TimeReport: your time. In your pocket.

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:Maps all'interno di un thread
« Risposta #8 il: 17 Ottobre 2010, 18:51:45 CEST »
0
ok credo di esserci...
così funziona ma il problema è che alla seconda partenza del timer l'app va in crash...
dov è l'inghippo secondo voi??  :-X
ps: l'oggetto Query_Async è inizializzato nel metodo onCreate()

Codice (Java): [Seleziona]
//alla pressione di un pulsante del menù:
...
case 0:
startTimer();
break;
...


public void startTimer()
        {
                TimerCountDown counter = new TimerCountDown(8000,1000);
                counter.start();
        }
       
        public class TimerCountDown extends CountDownTimer  
        {    
            public TimerCountDown(long millisInFuture, long countDownInterval)  
            {  
                super(millisInFuture, countDownInterval);  
            }  
                   
                @Override  
                public void onFinish()  
                {  
                task.execute("query");  
                }  
                   
                @Override  
                public void onTick(long millisUntilFinished)  
                {  

                }  
                   
        }  
       
        private class   extends AsyncTask<String, String, String>
        {
        @Override
        protected String doInBackground(String... values)
        {      
                query_update_mylocation();
                query_i_see_my_friend();
                return "ok";
        }

        @Override
        protected void onProgressUpdate(String... values) {}

        @Override
        protected void onPostExecute(String result)
       {
                startTimer();
        }

        }
       
TimeReport: your time. In your pocket.

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Maps all'interno di un thread
« Risposta #9 il: 17 Ottobre 2010, 20:03:49 CEST »
+1
Citazione
ok credo di esserci...
così funziona ma il problema è che alla seconda partenza del timer l'app va in crash...

Puoi eseguire l'AsyncTask una sola volta...poi devi ricrearlo. Quindi se la tua classe che estende AsyncTask si chiama ad esempio "MyTask", potresti eseguire la chiamata in questo modo :
Codice: [Seleziona]
new MyTask.execute(arg)
Tutto chiaro ? :-P

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:Maps all'interno di un thread
« Risposta #10 il: 17 Ottobre 2010, 20:12:35 CEST »
0
Puoi eseguire l'AsyncTask una sola volta...poi devi ricrearlo. Quindi se la tua classe che estende AsyncTask si chiama ad esempio "MyTask", potresti eseguire la chiamata in questo modo :
Codice: [Seleziona]
new MyTask.execute(arg)
Tutto chiaro ? :-P

no aspetta un attimo...  O:-)
io nell onCreate() ho inizializzato l'oggetto task scrivendo task=new Query_Async(); (il nome della classe che estende AsyncTask si chiama così...devo averla cancellata per sbaglio nel codice qui sopra..)
quindi da quel che ho capito al posto di task.execute(""); devo scrivere quello?
o devo scriverlo dentro la classe che estende AsyncTask?

ti ringrazio tantissimo per la risposta  :-)
TimeReport: your time. In your pocket.

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Maps all'interno di un thread
« Risposta #11 il: 17 Ottobre 2010, 20:35:36 CEST »
+1
se non erro, tu per "lanciare" la chiamata dell'oggetto Query_Async, fai riferimento all'istanza task al termine del timer, così : task.execute("query")
Ora, così facendo, la seconda volta non funzionerà, perchè puoi eseguire una sola volta il metodo execute() per ogni istanza. Quindi invece di creare un riferimento alla classe Query_Async, ti conviene usare una istanza anonima e sostituire
Codice: [Seleziona]
task.execute("query") con
Codice: [Seleziona]
new Query_Async.execute("query")eliminando il riferimento denominato task.

Spero sia più chiaro ora ;-)
« Ultima modifica: 17 Ottobre 2010, 20:43:45 CEST da teskio »

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:Maps all'interno di un thread
« Risposta #12 il: 17 Ottobre 2010, 23:08:56 CEST »
0
se non erro, tu per "lanciare" la chiamata dell'oggetto Query_Async, fai riferimento all'istanza task al termine del timer, così : task.execute("query")
Ora, così facendo, la seconda volta non funzionerà, perchè puoi eseguire una sola volta il metodo execute() per ogni istanza. Quindi invece di creare un riferimento alla classe Query_Async, ti conviene usare una istanza anonima e sostituire
Codice: [Seleziona]
task.execute("query") con
Codice: [Seleziona]
new Query_Async.execute("query")eliminando il riferimento denominato task.

Spero sia più chiaro ora ;-)

ok!!!! va alla perfezione!!! ti ringrazio!!!!
permettimi di farti una correzione...  :-P
sarebbe:
Codice (Java): [Seleziona]
new Query_Async().execute("query");
non sai quanto mi hai salvato la vita con questo!! ahahah  :-)
grazie ancora
« Ultima modifica: 17 Ottobre 2010, 23:59:41 CEST da robyrocker89 »
TimeReport: your time. In your pocket.