Autore Topic: AsyncTask - Corretta implementazione  (Letto 881 volte)

Offline Fenex86

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Google+
    • davide-vallicella/43/325/74
    • Mostra profilo
    • Libretto universitario
  • Dispositivo Android:
    Emulatore - 2.3
  • Sistema operativo:
    W7 - Kubuntu 11.10
AsyncTask - Corretta implementazione
« il: 30 Aprile 2012, 23:07:04 CEST »
0
Salve a tutti,

vorrei sapere qull'è la corretta implementazione di un AsincTask all'interno di una'Activity...ovvero quali sono i metodi da sovrascrivere e le varie eccezioni di cui bisogna tener conto qual'ora l'utente abbandonasse l'activity con il pulsante Back/Home ... ecc in modo da gestire tutti i possibili errori e salvare lo stato qual'ora l'activity venisse richiamata ripartendo da dove si era fermata.
Mi serve per gestire il login quindi ho pensato di creare un AsyncTask dove mi loggo e faccio varie richieste HTTP; vorrei poter gestire correttamente tutti gli errori.

grazie.

Codice (Java): [Seleziona]
private class LoginTask extends AsyncTask<String, Void, Boolean> {

                private ProgressDialog dialog;

                public LoginTask() {
                        cm = ConnectionManager.getInstance();
                }

                @Override
                protected void onPreExecute() {
                        super.onPreExecute();
                        disableLogin();
                        dialog = ProgressDialog.show(Login.this, "Please wait...",
                                        "Loading data ...", true, true,
                                        new DialogInterface.OnCancelListener() {
                                                @Override
                                                public void onCancel(DialogInterface dialog) {
                                                        loginTask.cancel(true);
                                                }
                                        });
                }

                @Override
                protected void onPostExecute(final Boolean success) {
                        super.onPostExecute(success);
                        if(dialog.isShowing())
                                dialog.dismiss();
                       
                        if (success)
                                loginHandler.sendEmptyMessage(SUCCESS);
                        else
                                loginHandler.sendEmptyMessage(FAILURE);
                        enableLogin();
                }

                @Override
                protected Boolean doInBackground(final String... params) {
                        if (params != null && params.length > 0 && !isCancelled())
                                return initPage(params[0]);

                        if (isOnline()) {
                                if (isCancelled())                                     
                                        return false;
                               
                                if (!cm.isLogged() && !isCancelled()) {
                                        cm.setCredentials(username, password);

                                        try {
                                                cm.authenticate();
                                        } catch (Exception e) {
                                                showErrorMessage(e.getMessage());
                                        }
                                }
                        } else {
                                showErrorMessage("Connessione NON attiva!");
                        }

                        return cm.isLogged() ? initPage(Utils.TARGET_LIBRETTO) : false;
                }


                @Override
                protected void onCancelled() {
                        super.onCancelled();
                        dialog.dismiss();
                        enableLogin();
                }
        }

vorrei sapere come utilizzare e se possono essermi utili questi metodi

Codice (Java): [Seleziona]
@Override
        protected void onSaveInstanceState(Bundle outState) {

}

@Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {

}

@Override
        protected void onSaveInstanceState(Bundle outState) {

}

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 - Corretta implementazione
« Risposta #1 il: 01 Maggio 2012, 09:55:22 CEST »
+1
Romain Guy (uno dei più noti engineer di android) in una sua app gestisce questa casistica in questo modo: se c'è un asyntask attivo quando l'activity viene distrutta e quindi richiama saveinstancestate (esempio nel caso della rotazione del display), ferma l'asynctask e salva nel bundle una variabile booleana, così che quando l'activity viene ricreata, fa ripartire automaticamente l'asynctask dall'inizio nel restoreinstancestate.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Fenex86

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Google+
    • davide-vallicella/43/325/74
    • Mostra profilo
    • Libretto universitario
  • Dispositivo Android:
    Emulatore - 2.3
  • Sistema operativo:
    W7 - Kubuntu 11.10
Re:AsyncTask - Corretta implementazione
« Risposta #2 il: 01 Maggio 2012, 10:40:01 CEST »
0
Graze per aver risposto.
Pensavo dunque di procedere in questo modo:

Codice (Java): [Seleziona]
 @Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if (loginTask != null && loginTask.getStatus() == AsincTask.Status.RUNNING) {
        outState.putBoolean(SIS_RUNNING_KEY, true);
    }
}


@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if (savedInstanceState.containsKey(SIS_RUNNING_KEY)) {
            if (savedInstanceState.getBoolean(SIS_RUNNING_KEY)) {
                Log.i(TAG, "Was previously logging in. Restart action.");
                doLogin();   // (loginTask.execute())
            }
      }
}

e ha senso mettere il codice del restore anche nel onCreate?

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:AsyncTask - Corretta implementazione
« Risposta #3 il: 01 Maggio 2012, 11:24:10 CEST »
+1
Dipende...in alcuni casi ha senso fare il restore direttamente nell'onCreate(), in altri nell'onRestoreInstanceState(). Farlo in tutti e due i metodi non ha molto senso a paper mio...poichè onRestoreInstanceState viene chiamato dopo l'onCreate, precisamente dopo l'onStart. Quindi se la tua activity fa solo il login per poi passare ad un altra activity di interfaccia, allora può bastare fare il restore nell'onCreate, se invece vuoi che l'interfaccia grafica venga ricreata comunque e che siano poi i metodi e/o sottoclassi ad essa legati a decidere l'implementazione idonea per lo stato dell'activity, allora bisogna implementare l'onResoreInstanceState.

Offline Fenex86

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Google+
    • davide-vallicella/43/325/74
    • Mostra profilo
    • Libretto universitario
  • Dispositivo Android:
    Emulatore - 2.3
  • Sistema operativo:
    W7 - Kubuntu 11.10
Re:AsyncTask - Corretta implementazione
« Risposta #4 il: 01 Maggio 2012, 11:28:34 CEST »
0
Grazie,

ho un'altro problema nel caso avvenga la rotazione dello schermo durante l'esecuzione del task come è meglio procedere?

Offline Fenex86

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Google+
    • davide-vallicella/43/325/74
    • Mostra profilo
    • Libretto universitario
  • Dispositivo Android:
    Emulatore - 2.3
  • Sistema operativo:
    W7 - Kubuntu 11.10
Re:AsyncTask - Corretta implementazione
« Risposta #5 il: 02 Maggio 2012, 15:00:24 CEST »
0