Autore Topic: Terminare un AsyncTask (e altre precisazioni)  (Letto 1056 volte)

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Terminare un AsyncTask (e altre precisazioni)
« il: 13 Febbraio 2014, 20:39:04 CET »
0
Salve. Nella mia app c'è un difetto. Se il segnale di internet è scarso (e con wind la cosa è relativamente semplice -.-) gli AsyncTask che avvio per fare le mie richieste http possono girare per tanto tanto taaanto tempo senza possibilità di essere fermati. Per bloccare il caricamento continuo devo uscire dall'app (tramite tasto home perché quello di back non sortisce alcun effetto) e chiudere la connessione internet. Come posso fare in modo di interrompere personalmente l'esecuzione dell'AsyncTask dall'app stessa? Avevo pensato a due cose:
1) Stoppare l'AsyncTask premendo il tasto back.
2) Creare un Handler che ferma automaticamente l'AsyncTask dopo un tot tempo (mi sembra più complicato).
La documentazione ufficiale dice di controllare periodicamente all'interno di doInBackground se il thread viene cancellato e chiuderlo di conseguenza, ma non posso implementare una cosa simile perché non ho cicli nei miei AsyncTask.

Questo è un AsyncTask che uso per calcolare l'elevazione:

Codice: [Seleziona]
private class ElevationAsyncTask extends AsyncTask<Void,Void,Double> {

        private double lon;
        private double lat;
        private ProgressDialog mDialog;

        public ElevationAsyncTask(double lon, double lat) {
            this.lon = lon;
            this.lat = lat;
            mDialog = ProgressDialog.show(MainActivity.this, "", "Caricamento...", true);
        }

        @Override
        protected Double doInBackground(Void... params) {
            double result = 0;
            //Richiesta HTTP
            HttpClient httpClient = new DefaultHttpClient();
            HttpContext localContext = new BasicHttpContext();
            //Costruzione dell'URL
            String url = "http://maps.googleapis.com/maps/api/elevation/"
                    + "xml?locations=" + String.valueOf(lat)
                    + "," + String.valueOf(lon)
                    + "&sensor=true";
            HttpGet httpGet = new HttpGet(url);
            try {
                //Otteniamo il responso
                HttpResponse response = httpClient.execute(httpGet, localContext);
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    InputStream instream = entity.getContent();
                    int r;
                    StringBuffer respStr = new StringBuffer();
                    //Leggiamo il responso XML
                    while ((r = instream.read()) != -1)
                        respStr.append((char) r);
                    String tagOpen = "<elevation>";
                    String tagClose = "</elevation>";
                    //Cerchiamo l'elevazione in base ai tag
                    if (respStr.indexOf(tagOpen) != -1) {
                        int start = respStr.indexOf(tagOpen) + tagOpen.length();
                        int end = respStr.indexOf(tagClose);
                        //Otteniamo l'elevazione
                        String value = respStr.substring(start, end);
                        result = (Double.parseDouble(value)); //In metri
                    }
                    instream.close();
                }
            }
            catch (ClientProtocolException e) {
                e.printStackTrace();
            }
            catch (IOException e) {
                e.printStackTrace();
            }

            return result;
        }

        @Override
        protected void onPostExecute(Double result) {
            if(mDialog != null) {
                if(mDialog.isShowing()) {
                    mDialog.dismiss();
                }
            }
            //A calcolo compiuto mostriamo l'altitudine
            Toast.makeText(MainActivity.this, "Altitudine: " + result + " m  ", Toast.LENGTH_LONG).show();
        }
    }

Ps: per gestire al meglio gli AsyncTask devo fare qualcosa di specifico nei metodi onStop() ed onDestroy()?

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:Terminare un AsyncTask (e altre precisazioni)
« Risposta #1 il: 13 Febbraio 2014, 20:47:43 CET »
+1
Secondo me basta che imposti (come è abbastanza usuale) i timeout di connessione e gestisci gli eventi di timeout.

Scrivo a occhio senza provare:
Codice (Java): [Seleziona]
HttpParams httpparams= new BasicHttpParams();
// timeout per la connessione
int con_timeout = 5000;    // millisecondi
HttpConnectionParams.setConnectionTimeout(httpparams,con_timeout);
// timeout per i dati
int data_timeout = 10000;    // millisecondi
HttpConnectionParams.setSoTimeout(httpparams,data_timeout);
// creazione client con i timeout
DefaultHttpClient httpClient = new DefaultHttpClient(httpparams);
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Re:Terminare un AsyncTask (e altre precisazioni)
« Risposta #2 il: 14 Febbraio 2014, 09:03:45 CET »
0
Ok grazie, in effetti non ci avevo pensato. Però è difficile provarlo. Devo cercare un posto specifico dove prende poco la connessione  :-P
Comunque, allo scadere del tempo cosa accade? Viene generata eccezione? Perché l'importante è che l'AsyncTask si fermi.

Ps (offTopic): è più indicato il post o il get per le richieste alle Google Api?
« Ultima modifica: 14 Febbraio 2014, 09:12:33 CET da Elmvor »

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS7
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Terminare un AsyncTask (e altre precisazioni)
« Risposta #3 il: 14 Febbraio 2014, 09:28:16 CET »
0
Non basta mettersi in modalità aereo?
Dovrebbe andare in timeout...

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Re:Terminare un AsyncTask (e altre precisazioni)
« Risposta #4 il: 14 Febbraio 2014, 09:37:50 CET »
0
Si si ho provato e funziona. Non ci è voluto molto per vedere una scarsissima E al segnale. Genera eccezione (che io catturo) fermando l'AsyncTask! :)