Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    [Android] AsyncTask: ProgressDialog non si aggiorna

    Ciao a tutti.
    Sto iniziando, finalmente, a sviluppare per Android e, almeno finora, le soddisfazioni sono molte.

    C'è, però, un problema che non riesco a risolvere.
    Ho scritto un AsyncTask che usa una ProgressDialog per visualizzare la progressione del download di un file: la progress dialog viene correttamente visualizzata e chiusa alla fine, il file viene correttamente scaricato, ma non viene visualizzato alcun progresso.
    Ho navigato in lungo ed in largo, consultato tutta la documentazione (che, per quanto riguarda ProgressDialog, è assolutamente assente), consultato la guida ufficiale, letto decine di post su SO e tutto ciò che ho trovato sono esempi pressoché identici al codice che ho sviluppato io.

    Posto il codice:

    codice:
    public class MyActivity extends Activity {
    
        private class DownTask extends AsyncTask<String, Integer, String> {
            
            private Context ctx;
            private ProgressDialog dialogDownload;
            
            public DownTask(Context ctx) {
                this.ctx = ctx;
            }
            
            @Override
            public void onPreExecute() {
                dialogDownload = new ProgressDialog( ctx );
                dialogDownload.setMessage("Download del file in corso...");
                dialogDownload.setProgressStyle( ProgressDialog.STYLE_HORIZONTAL );
                dialogDownload.setIndeterminate( false );
                dialogDownload.setMax( 100 );
                dialogDownload.show();
            }
            
            @Override
            protected String doInBackground(String... fileUrl) {
                String myFilePath = ...;
                String localPath = Environment.getExternalStorageDirectory().getPath() + myFilePath;
                InputStream input = null;
                OutputStream output = null;
                try {
                    // Mi connetto al URL
                    URL url = new URL( fileUrl[0] );
                    URLConnection connection = url.openConnection();
                    connection.connect();
    
                    // Ottengo la dimensione del file da scaricare
                    int fileLength = connection.getContentLength();
                    
                    // Apro gli stream di input/output
                    input = new BufferedInputStream( url.openStream() );
                    output = new FileOutputStream( localPath );
    
                    // Scarico il file a blocchi di 1024 byte
                    byte data[] = new byte[1024];
                    int total = 0;
                    int count;
                    int lastProgress = 0;
                    while ((count = input.read(data)) != -1) {
                        total += count;
                        Integer byteProgress = total * 100 / fileLength;
                        if (byteProgress != lastProgress) {
                            publishProgress( byteProgress );
                            lastProgress = byteProgress;
                        }
                        output.write(data, 0, count);
                    }
    
                    // Effettuo il flush
                    output.flush();
                } catch (Exception e) {
                    Log.e("MyActivity.DownTask", "Errore in download del file", e);
                } finally {
                    if (output != null) {
                        try { output.close(); } catch (Exception e) { }
                    }
                    if (input != null) {
                        try { input.close(); } catch (Exception e) { }
                    }
                }
                return localPath;
            }
            
            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
                dialogDownload.setProgress( values[0] );
            }
            
            @Override
            protected void onPostExecute(String path) {
                dialogDownload.dismiss();
                
                // Lavora col file
                ...
            }
        }
    
        ...
    
        private void iniziaDownload() {
            String myFileUrl = ...;
            DownTask dwn = new DownTask( this );
            dwn.execute( myFileUrl );
        }
        
        ...
    }

    Avviando l'app sull'emulatore funziona tutto (e la progress bar avanza correttamente). Avviando l'app sul mio Galaxy SII, invece, ottengo il comportamento descritto sopra: la dialog appare, rimane ferma (a 0) per tutto il processo di download e viene chiusa alla fine.

    Capita anche a qualcun altro?


    Ciao.
    Ultima modifica di LeleFT; 31-01-2014 a 11:51
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    intervengo pure io perchè avevo avuto un problema che poi non ho più risolto.
    hai controllato se onProgressUpdate viene correttamente chiamato dopo publishprogres?

    dopo che in onprogressupdate viene richiamato super.onProgressUpdate(values), viene chiamato il metodo dialogDownload.setProgress( values[0])?

    perchè secondo me il problema è nell'asynctask, non nella progressdialog
    Ultima modifica di Rising1; 02-02-2014 a 17:47

  3. #3
    ciao scusa se sono fuoriluogo..ma volevo chiederti da dove stai studiando android....se puoi mi dici il titolo del libro oppure il link che usi?a settembre dovrei dare un esame...e volevo vedere da dove studiare..grazie..

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da Rising1 Visualizza il messaggio
    intervengo pure io perchè avevo avuto un problema che poi non ho più risolto.
    hai controllato se onProgressUpdate viene correttamente chiamato dopo publishprogres?

    dopo che in onprogressupdate viene richiamato super.onProgressUpdate(values), viene chiamato il metodo dialogDownload.setProgress( values[0])?

    perchè secondo me il problema è nell'asynctask, non nella progressdialog
    Per fare dei test ho inserito un Log.d() in onProgressUpdate ed il LogCat mi dimostra che il metodo viene correttamente chiamato. Tant'è che nell'emulatore la progress dialog viene correttamente aggiornata.


    Quote Originariamente inviata da rossonero922 Visualizza il messaggio
    ciao scusa se sono fuoriluogo..ma volevo chiederti da dove stai studiando android....se puoi mi dici il titolo del libro oppure il link che usi?a settembre dovrei dare un esame...e volevo vedere da dove studiare..grazie..
    Non sto usando nessun libro, per il momento... on-line c'è praticamente di tutto e di più.
    Ad ogni modo, tempo fa ho scaricato e stampato questo libro. Devo ancora prenderlo per mano perchè, appunto, per il momento il materiale on-line è più che sufficiente:

    API Guides: io sono partito da qui. Qui ti spiegano per filo e per segno come funziona Android, qual è il ciclo di vita delle Activity, dei Fragments e di tutti i vari componenti.

    Reference: è l'equivalente della documentazione Java... devo dire che mi aspettavo fosse fatta molto meglio di così... purtroppo ci si deve accontentare.

    Training: qui ci sono diversi esempi più o meno completi, che almeno danno delle linee guida su come muoversi.

    Poi c'è StackOverflow, che per qualunque ricerca fatta su Google in merito ad un argomento ha tantissime risposte.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    io Venerdì ho comprato quello di Massimo Carli (non ho avuto ancora il tempo di leggerlo) che integrerò con la guida sul sito che hai appena citato che già conoscevo.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  6. #6
    Sarò stanco ... Ma dove aggiorni la barra?
    http://igr4mbo.altervista.org (piano piano)

    "Abbiamo costruito un sistema che ci persuade a spendere il denaro che non abbiamo in cose che non necessitiamo per creare impressioni che non dureranno su persone che non ci interessano" cit.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da Grambo Visualizza il messaggio
    Sarò stanco ... Ma dove aggiorni la barra?
    Nel metodo doInBackground () viene chiamato il metodo publishProgress (), che a sua volta fa sì che venga eseguito il metodo onProgressUpdate () nel contesto della GUI. Lì c'è l'aggiornamento della progress.

    Ho visto solo ora questa risposta, e mi scuso per il ritardo, ma solo oggi ho ripreso in mano questa problematica ed ho scoperto l'inghippo: non sempre nella response della richiesta HTTP viene indicata la lunghezza totale della stessa, quindi il metodo getContentLength () restituisce -1. Ovviamente questo crea problemi nella logica di calcolo della percentuale di avanzamento. Soluzione: recupero la lunghezza del file da scaricare in altro modo, così da averlo sempre.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.