Autore Topic: Asynctask gestire il return.  (Letto 726 volte)

Offline ivanp

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy next turbo, Samsung Galaxy note
  • Play Store ID:
    Shakesoft
  • Sistema operativo:
    Win 7; Centos 6.2
Asynctask gestire il return.
« il: 28 Aprile 2013, 12:24:23 CEST »
0
Buongiorno a tutti,

Ho provato a cercare in giro per questo forum il modo per gestire l'asynctask ma non sono riuscito a trovare una soluzione al mio problema.

Come ho letto in giro per il web e in questo forum utilizzando il metodo .get() utilizzo la modalità bloccante del mio asynctask. Quello che sto cercando di fare è:

utilizzare l'asynctask per chiamare un WS soap.
aspettare il termine dell'operazione da quando lancio il execute() dell'asynctask.
visualizzare un progress dialog durante l'esecuzione
far ritornare il mio valore e riprendere il maintrhead da dove ho lanciato il mio asynctask.

questo è il codice del mio asynctask:
Codice: [Seleziona]
              class myAsync extends AsyncTask<Void, Void, String> {
                        ProgressDialog progressDialog;
                       
                       
                         @Override
                            protected void onPostExecute(String result)
                            {
                               
                                progressDialog.cancel();
                               
                               

                            }

                            @Override
                            protected void onPreExecute() {

                                progressDialog = new ProgressDialog(mythread.this);
                                progressDialog.setMessage("Attendi...");
                                progressDialog.setCancelable(false);
                                progressDialog.show();

                            }
                       
                       
                       
                        @Override
                        protected String doInBackground(Void... params) {
                                // TODO Auto-generated method stub
                               
                                         String ret = ws.myWS(param1, res[1], param3, resync_code);
                                    
                                       
                                        return ret;
                        }

                 }

mentre questo è dove lo chiamo:
Codice: [Seleziona]
AsyncTask<Void, Void, String> ret = new myAsync().execute(null);
                                                                               
String response = ret.get(); //qui è dove blocco il mainThread
                                                                               
if (response.contains("\r\n") == true){....

qualcuno può aiutarmi?

Ivan
« Ultima modifica: 28 Aprile 2013, 12:30:12 CEST da ivanp »

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:Asynctask gestire il return.
« Risposta #1 il: 28 Aprile 2013, 14:11:22 CEST »
+1
non devi MAI fare il get() sull'asynctask,perchè così lo esegui sul main thread.
semplicemente la logica della response la sposti nel postexecute()

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 gestire il return.
« Risposta #2 il: 28 Aprile 2013, 15:25:54 CEST »
0
Non so cosa tu debba fare con esatezza nel tuo programma, ma per fare un po' di chiarezza ti posso dire che il metodo get() blocca l'esecuzione del "chiamante" e aspetta il risultato dell'AsyncTask, mentre il metodo execute(Params... params) esegue l'AsyncTask senza bloccare il "chiamante". In pratica è come se, per dirla in modo "grezzo", eseguissi l'AsyncTask in modo "sincrono" attraverso il metodo get(). Ora dipende dalle tue esigenze e da cosa il tuo software deve computare. Avere ad esempio più thread concorrenziali potrebbe porre il problema dell'attesa di un particolare dato prima di continuare l'esecuzione di un altro thread, quindi dipende dal grado di complessità del tuo software. Se invece hai la sola necessità di computare un solo dato (o insieme di dati) ottenendo una sola risposta, ti consiglio di eseguire l'AsyncTask in modo "classico" cioè asincrono, e gestire il risultato attraverso gli eventi.

Off-Topic:
@lorux : non è vero che non si deve mai eseguire il get() sull'AsyncTask, anche perchè se è stato implementato c'è sempre un motivo  :-)

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 gestire il return.
« Risposta #3 il: 28 Aprile 2013, 18:44:47 CEST »
0
Off-Topic:
@lorux : non è vero che non si deve mai eseguire il get() sull'AsyncTask, anche perchè se è stato implementato c'è sempre un motivo  :-)

Mi sono posto anche io questa domanda. Gli unici due casi in cui ne vedo un uso è (1) per test e debug, (2) quando avvio un asynctask dentro un altro asynctask e devo attenderne la conclusione prima di procedere.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline ivanp

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy next turbo, Samsung Galaxy note
  • Play Store ID:
    Shakesoft
  • Sistema operativo:
    Win 7; Centos 6.2
Re:Asynctask gestire il return.
« Risposta #4 il: 29 Aprile 2013, 08:07:07 CEST »
0
Buongiorno,
Grazie a tutti dell'aiuto! Ho inserito nel onPostExecute() la logica per la gestione del dato e funziona alla grande  ;-)

Codice: [Seleziona]
                   protected void onPostExecute(String result)
                            {
                                 
                                 
                                 if (result.contains("\r\n") == true){
                                 ..........

Vi ringrazio molto dell'aiuto.

Ivan

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Asynctask gestire il return.
« Risposta #5 il: 29 Aprile 2013, 09:01:41 CEST »
0
Dai una occhiata a questo post.
http://www.anddev.it/index.php/topic,10773.msg57375.html#msg57375
E' molto simile al tuo caso e valgono le stesse considerazioni.