Autore Topic: AsyncTask genera thread infiniti  (Letto 1290 volte)

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
AsyncTask genera thread infiniti
« il: 19 Ottobre 2010, 00:33:31 CEST »
0
Ciao a tutti,
ho un problema con l'asynctask nella mia applicazione in via di sviluppo...
in sostanza ho bisogno di eseguire in background 2 metodi ogni 8 secondi...ho creato un timer che ogni 8 secondi fa partire un nuova asynctask...
il vero problema è che nel debug in realtà ogni 8 secondi viene creato un nuovo thread (asynctask) e che quello precedente non viene chiuso. Questo porta l'applicazione a crashare ovviamente...ho provato il metodo cancel() ma sembra non funzionare!!!
vi allego il codice nella speranza possiate darmi una mano!!  :-)


Codice (Java): [Seleziona]
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()  
            {  
                        new Query_Async().execute("query");
            }  
                   
            @Override  
            public void onTick(long millisUntilFinished){}      
        }  
       
        private class Query_Async extends AsyncTask<String, String, String>
        {
        @Override
        protected String doInBackground(String... values)
        {      
                metodo1();
                metodo2();
                return "ok";
        }

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

        @Override
        protected void onPostExecute(String result)
        {
                startTimer();
                //Query_Async.this.cancel(true);
        }
        }
TimeReport: your time. In your pocket.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:AsyncTask genera thread infiniti
« Risposta #1 il: 19 Ottobre 2010, 09:56:05 CEST »
0
In attesa che ti rispondano sul tuo metodo... perché non hai usato un Handler? Sicuramente più semplice!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:AsyncTask genera thread infiniti
« Risposta #2 il: 19 Ottobre 2010, 10:57:10 CEST »
+1
Confesso intanto la mia poca esperienza con i Timer e quindi non sono in grado di dare certezze, però ti riporto qualcosa sugli AsyncTask che secondo me possono aiutarti.

1) Gli AsyncTask devono essere lanciati da un main UI thread (non devono ad esempio essere usati in una libreria).

2) Quando crei un AsyncTask non crei un thread, crei un blocco di operazioni (chiamiamolo task) che verrà schedulato su uno dei thread a disposizione in un thread pool (che per inciso ha dimensioni ridotte e statiche, che almeno fino a qualche tempo fa era 10). Sei crei asynctask più rapidamente di quanti ne finiscono, esplode tutto.

Come dice Marco, penso che a te serva un Thread/Handler, visto che gli AsyncTask sono pensati più che altro per facilitare l'update della UI in seguito ad operazioni che non possono essere eseguite nel main UI thread. Oppure, prova a ripensare l'applicazione in modo che non debba creare un nuovo thread ogni 8 secondi.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:AsyncTask genera thread infiniti
« Risposta #3 il: 19 Ottobre 2010, 11:45:19 CEST »
0
Confesso intanto la mia poca esperienza con i Timer e quindi non sono in grado di dare certezze, però ti riporto qualcosa sugli AsyncTask che secondo me possono aiutarti.

1) Gli AsyncTask devono essere lanciati da un main UI thread (non devono ad esempio essere usati in una libreria).

2) Quando crei un AsyncTask non crei un thread, crei un blocco di operazioni (chiamiamolo task) che verrà schedulato su uno dei thread a disposizione in un thread pool (che per inciso ha dimensioni ridotte e statiche, che almeno fino a qualche tempo fa era 10). Sei crei asynctask più rapidamente di quanti ne finiscono, esplode tutto.

Come dice Marco, penso che a te serva un Thread/Handler, visto che gli AsyncTask sono pensati più che altro per facilitare l'update della UI in seguito ad operazioni che non possono essere eseguite nel main UI thread. Oppure, prova a ripensare l'applicazione in modo che non debba creare un nuovo thread ogni 8 secondi.

Ciao! intanto grazie per la risposta!! :)
per quanto riguarda il punto 1 non sto lanciando l'asynctask da un'altra libreria...quello che ho incollato qui sopra era solo la parte di codice che ho preso dall'activity su cui deve girare  :-)

sul punto 2 mi hai illuminato un po'...nel senso che forse il problema sta nel fatto che ne creo più rapidamente di quanti ne finiscono...potrebbe essere il problema principale...

per il discorso handler/thread li ho già provati ma credo non facciano al caso mio: sto sviluppando una applicazione che premendo un bottone (detto molto semplificato) rilevi la mia posizione su google maps e quella di un altro utente in tempo reale...per fare ciò mi avvalgo di 2 query (i 2 metodi inizialmente descritti) che ogni 8 secondi devono eseguire un update della mia posizione e una select delle coordinate dell altro utente su un db mysql che poi verranno passate a google maps per gli overlay...utilizzando i thread/handler, ogni X secondi la mappa freeza dandomi il messaggio di ANR...ho trovato soluzione utilizzando gli asynctask (che non interferiscono sull interfaccia utente poichè girano in background)....

se provassi un handler con il relativo metodo postdelay all interno dell asynctask? imploderebbe tutto vero?  :-o
TimeReport: your time. In your pocket.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:AsyncTask genera thread infiniti
« Risposta #4 il: 19 Ottobre 2010, 12:18:54 CEST »
0
robyrocker89, con la tua implementazione attuale ad AsyncTask, in modo un po' grezzo io alzerei a 60 secondi il timer (così da escludere il rischio che non finisca in tempo) e loggherei inizio e fine dei task in modo da avere i tempi e l'evidenza di eventuali problemi.

Se usi Thread/Handler usa quelli e non usare gli AsyncTask, il fatto che prima di generasse un errore è un altro problema.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:AsyncTask genera thread infiniti
« Risposta #5 il: 19 Ottobre 2010, 12:23:56 CEST »
0
ok! ma c'è un modo per far girare un handler/thread in background senza che esso interferisca con l'usabilità/fluidità dell'applicazione?

ti ringrazio  :-)
TimeReport: your time. In your pocket.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:AsyncTask genera thread infiniti
« Risposta #6 il: 19 Ottobre 2010, 12:52:06 CEST »
0
ok! ma c'è un modo per far girare un handler/thread in background senza che esso interferisca con l'usabilità/fluidità dell'applicazione?

In teoria i thread/handler servono proprio a quello, l'handler serve proprio a ricevere messaggi dai thread e aggiornare l'UI.

Però ricorda che nemmeno questi ti mettono al riparo dal creare più thread di quanti ne finiscano. Questa sicurezza devi inserirla tu nel codice.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline robyrocker89

  • Utente junior
  • **
  • Post: 55
  • Respect: +1
    • roberto-tucci
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Windows
Re:AsyncTask genera thread infiniti
« Risposta #7 il: 19 Ottobre 2010, 13:05:40 CEST »
0
ti ringrazio un sacco!!!   :-)

questo potrebbe fare al caso mio?
Common Tasks and How to Do Them in Android | Android Developers


EDIT: ho risolto proprio così!!! grazie!! :D
« Ultima modifica: 19 Ottobre 2010, 23:46:16 CEST da robyrocker89 »
TimeReport: your time. In your pocket.

Offline Gambanera

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Vodafone ideos
  • Play Store ID:
    Gambanera
  • Sistema operativo:
    Ubuntu 10.10 / Windows 7
Re:AsyncTask genera thread infiniti
« Risposta #8 il: 05 Gennaio 2011, 16:32:28 CET »
0
Anch'io ho un problema analogo ma non ho capito come tu abbia fatto a risolverlo. La tua soluzione si basa ancora sugli AsyncTask?