Autore Topic: AsyncTask e lifecycle  (Letto 991 volte)

Offline g4b0

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: 0
    • Mostra profilo
    • gabo 3.0
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Debian Testing
AsyncTask e lifecycle
« il: 29 Settembre 2011, 09:38:09 CEST »
0
Ciao,
Ho una questione "teorica", che peró come al solito avrá delle ripercussioni sulla pratica. Ho un'Activity che alla pressione di un menu lancia un AsyncTask che collegandosi ad un DB remoto (MSSQL) inizia una procedura di importazione dati che puó essere molto lunga (di solito < 1min, ma puó arrivare anche a 20min).

Se durante l'esecuzione dell'AsyncTask ricevo una chiamata l'Activity viene messa in pausa, ma l'AsyncTask continua a girare finché non termina, o viene messa in pausa pure lei?
--
g4b0, linux user n. 369000
http://brosulo.net

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 e lifecycle
« Risposta #1 il: 29 Settembre 2011, 09:55:07 CEST »
0
Ciao,
Ho una questione "teorica", che peró come al solito avrá delle ripercussioni sulla pratica. Ho un'Activity che alla pressione di un menu lancia un AsyncTask che collegandosi ad un DB remoto (MSSQL) inizia una procedura di importazione dati che puó essere molto lunga (di solito < 1min, ma puó arrivare anche a 20min).
Se durante l'esecuzione dell'AsyncTask ricevo una chiamata l'Activity viene messa in pausa, ma l'AsyncTask continua a girare finché non termina, o viene messa in pausa pure lei?

AFAIK : AsyncTask è pensato per compiti che durano una decina di secondi, che partono e finiscono mentre l'activity è "viva". L'AsyncTask può essere unilateralmente terminato dal sistema, quando mancano risorse e ci sono altre activity in primo piano ad esempio. Per il tuo caso potrebbe essere molto più adatto un Service.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline g4b0

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: 0
    • Mostra profilo
    • gabo 3.0
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Debian Testing
Re:AsyncTask e lifecycle
« Risposta #2 il: 29 Settembre 2011, 10:01:36 CEST »
0
Ok, come immaginavo...
Ma con un Service riesco a gestire una progressbar come con l'AsyncTask?

--
g4b0, linux user n. 369000
http://brosulo.net

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AsyncTask e lifecycle
« Risposta #3 il: 29 Settembre 2011, 10:57:14 CEST »
0
Ok, come immaginavo...
Ma con un Service riesco a gestire una progressbar come con l'AsyncTask?

Si, certo.
Puoi ad esempio usare un IntentService unito a un'implementazione di ResultReceiver... qui c'è un esempio chiarificatore:
http://stackoverflow.com/questions/3197335/android-restful-api-service/3197456#3197456

Offline g4b0

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: 0
    • Mostra profilo
    • gabo 3.0
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Debian Testing
Re:AsyncTask e lifecycle
« Risposta #4 il: 29 Settembre 2011, 17:20:42 CEST »
0
Perfetto, grazie al tuo esempio sono riuscito ad implementare il Service con tanto di ResultReceiver condiviso con l'Activity, per cui ora comunicano alla grande. Mi manca un ultimo mattoncino, poi ho finito  8-)

Qunado viene premuto un tasto del menu, l'applicazione deve fare, in ordine:

  • Copiare il file del DB sulla SD (AsyncTask)
  • Sincronizzare il contenuto del DB sul DB remoto (Service)

Funziona tutto alla grande con il codice seguente, ma ha un difetto: non aspetta la fine dell'AsyncTask prima di lanciare il Service. E questo é un problema, perché il Service modifica il contenuto del DB SQLite, mentre io lo voglio copiare sulla SD prima che venga modificato.

Codice (Java): [Seleziona]
                case SYNC_LOCALI:

                        //@formatter:off
//                      // Creo il nuovo thread per gestire la sincronizzazione
//                      if (isConnected(this)) {
//                              new SyncDataTask(this).execute();
//                      } else {
//                              Toast.makeText(ListLocali.this, "Wifi non connesso, non posso procedere con la sincronizzazione", Toast.LENGTH_SHORT).show();
//                      }
                        //@formatter:on
                       
                        if (ListLocali.this.isExternalStorageAvail()) {
                                new ExportDatabaseFileTask().execute();
                        } else {
                                Toast.makeText(ListLocali.this, "Scheda di memorizzazione non disponibile, non posso salvare il db", Toast.LENGTH_SHORT).show();
                        }

                        // Faccio partire il Service per la sincronizzazione remota
                        if (isConnected(this)) {
                                final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, SyncDataService.class);
                                intent.putExtra("receiver", mReceiver);
                                intent.putExtra("command", "sync");
                                startService(intent);
                        } else {
                                Toast.makeText(ListLocali.this, "Wifi non connesso, non posso procedere con la sincronizzazione", Toast.LENGTH_SHORT).show();
                        }
                        return true;
--
g4b0, linux user n. 369000
http://brosulo.net