Autore Topic: Aspettare che AsyncTask abbia terminato  (Letto 719 volte)

Offline matteo.pizzorni

  • Utente junior
  • **
  • Post: 65
  • Respect: +2
    • Mostra profilo
Aspettare che AsyncTask abbia terminato
« il: 05 Novembre 2012, 10:47:01 CET »
0
Ciao, ho un'attivita' principale che lancia un asynctask. Il problema è che questo asynctask viene laciato quando l'attivita' principale sta per chiudersi. In questo modo l'app va in crash perche' viene raggiunto il finish() prima che l'asyntask abbia finito. Come faccio ad attendere che il processo finisca?
Grazie

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:Aspettare che AsyncTask abbia terminato
« Risposta #1 il: 05 Novembre 2012, 10:56:11 CET »
0
Cosa vuoi fare?
Sicuro che non ti serve un service?

Offline matteo.pizzorni

  • Utente junior
  • **
  • Post: 65
  • Respect: +2
    • Mostra profilo
Re:Aspettare che AsyncTask abbia terminato
« Risposta #2 il: 05 Novembre 2012, 11:24:13 CET »
0
In realta' è abbastanza semplice. La main activity, all'uscita, deve salvare dati in una tabella sqlite. Siccome i dati sono tanti non volevo che l'utente pensasse fosse tutto bloccato e cosi' faccio partire un asyntask che mi da il progresso dell'operazione. Se non aspetto a lanciare il finish() da errore. Se ci sono altre strade per lanciare un progresso sono ben disposto a implementarle.
Uso altri asynctask in altri pèunti dell'app e tutto funziona a meraviglia, ovviamente a patto che queste operazioni non siano collegate all'uscita dall'activity
Grazie

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:Aspettare che AsyncTask abbia terminato
« Risposta #3 il: 05 Novembre 2012, 12:00:22 CET »
0
Non so quanto diffusamente sia usato come metodo, ma io ho preso l'abitudine a spedire un messaggio dagli asynctask all'handler dell'activity.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Aspettare che AsyncTask abbia terminato
« Risposta #4 il: 05 Novembre 2012, 12:02:33 CET »
0
In realta' è abbastanza semplice. La main activity, all'uscita, deve salvare dati in una tabella sqlite. Siccome i dati sono tanti non volevo che l'utente pensasse fosse tutto bloccato e cosi' faccio partire un asyntask che mi da il progresso dell'operazione. Se non aspetto a lanciare il finish() da errore. Se ci sono altre strade per lanciare un progresso sono ben disposto a implementarle.
Uso altri asynctask in altri pèunti dell'app e tutto funziona a meraviglia, ovviamente a patto che queste operazioni non siano collegate all'uscita dall'activity
Grazie

Io per fare una roba del genere semplicemente farei partire un intent service che in background mi fa tutte le operazioni che mi servono indipendentemente dal fatto che l'activity esista ancora o meno.
L'asynctask, a mio parere, non è adatto a questo scopo perchè il suo lifecycle è legato a quello dell'activity.

Offline matteo.pizzorni

  • Utente junior
  • **
  • Post: 65
  • Respect: +2
    • Mostra profilo
Re:Aspettare che AsyncTask abbia terminato
« Risposta #5 il: 05 Novembre 2012, 12:51:23 CET »
0
In effetti forse le strade sono altre... cmq ho trovato questo getStatus()... potrei ciclare finche' non mi da che l'asynctask è terminato....

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:Aspettare che AsyncTask abbia terminato
« Risposta #6 il: 05 Novembre 2012, 12:52:27 CET »
0
In effetti forse le strade sono altre... cmq ho trovato questo getStatus()... potrei ciclare finche' non mi da che l'asynctask è terminato....

Sporchi esclusivamente il codice... secondo il mio punto di vista devi fare tutto dentro un service.

Offline matteo.pizzorni

  • Utente junior
  • **
  • Post: 65
  • Respect: +2
    • Mostra profilo
Re:Aspettare che AsyncTask abbia terminato
« Risposta #7 il: 05 Novembre 2012, 12:58:47 CET »
0
Il problema grosso, e non so se mi sono spiegato bene, è che , oltre ad uscire dall'activity, deve fare cose sui dati appena elaborati, e per forza non puo' cominciare finche' il task non è terminato (altrimenti non ci sono dati, o peggio trova il db locked)

Per il ciclo forse cosi' il codice non si inzozza piu' di tanto... che dite? (sempre che funzioni, devo ancora provare per bene)
Codice (XML): [Seleziona]
                                                RigeneraDescrizioni rigenera = new RigeneraDescrizioni(
                                                                PreferencesDb.this);
                                                rigenera.execute();
                                                do
                                                {
                                                }
                                                while (rigenera.getStatus().equals(Status.RUNNING));
// altra robazza.....
finish();

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Aspettare che AsyncTask abbia terminato
« Risposta #8 il: 05 Novembre 2012, 13:19:25 CET »
0
Blocchi il main thread... non è la soluzione corretta.
Come ti abbiamo suggerito, ti conviene utilizzare un Service in modo da ultimare le operazioni anche se l'Activity si è chiusa.