Autore Topic: organizzazione del lavoro con AsyncTask  (Letto 442 volte)

Offline minomic

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: +2
    • Mostra profilo
organizzazione del lavoro con AsyncTask
« il: 06 Maggio 2013, 17:16:13 CEST »
0
Ciao a tutti, mi trovo a dover affrontare alcune operazioni sulla Rete. Quello che voglio fare è questo:

Codice: [Seleziona]
try {
      operazione di upload / download
} catch(eccezione 1) {
      prepara e visualizza un AlertDialog
} catch(eccezione 2) {
      prepara e visualizza un altro AlertDialog
} eccetera

Allora ho creato una nuova classe dentro a quella principale

Codice: [Seleziona]
private class EseguiBackup extends AsyncTask {
                @Override
                protected Object doInBackground(Object... params) {
                        codice di prima
                        return null;
                }

        }

Poi nella classe principale, nel codice attivato dal clic su un bottone, ho messo

Codice: [Seleziona]
new EseguiBackup().execute();
ma genera un'eccezione. A quanto ho dedotto non posso creare l'AlertDialog dalla classe interna. Come posso quindi organizzare il codice? Non so se la domanda sia chiara... Nel caso chiedete pure!
Grazie.

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:organizzazione del lavoro con AsyncTask
« Risposta #1 il: 06 Maggio 2013, 17:30:40 CEST »
+1
Genera una eccezione perchè non puoi "toccare" (modificare) le view che ha creato un altro thread, in questo caso quello principale.
Quindi, per mostrare un alertdialog, dovresti farlo o nel metodo onPostExecute (in cui controlli se è andato tutto bene o in caso contrario mostri l'alert) o in onProgressUpdate (che chiami dal doInBackground con publishProgress).

Un altro modo, che penso sia un "trucchetto" (cioè non penso sia buona programmazione), è passare nel costruttore dell'asynctask un context e poi fare context.runonuithread

Codice (Java): [Seleziona]
private class EseguiBackup extends AsyncTask {

                 public EseguiBackup(Context context) {
                    this.context = context;
                 }
                @Override
                protected Object doInBackground(Object... params) {
                        codice di prima

                        //nel catch
                        context.runOnUiThread() {
                                   new Thread(){
                                          //qui ci va il tuo codice per l'alert
                                   }
                        };
                        return null;
                }

        }
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline minomic

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: +2
    • Mostra profilo
Re:organizzazione del lavoro con AsyncTask
« Risposta #2 il: 06 Maggio 2013, 17:34:17 CEST »
0
Ok, grazie per la risposta! Proverò a fare le cose per bene e ad utilizzare onPostExecute.  ;-)