Autore Topic: Cambiare il tipo di ProgressDialog da Horizontal a Spinner dopo un AsyncTask  (Letto 693 volte)

Offline madelu86

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    madelu86
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Salve, sono nuovo del forum e del mondo android, e sto impazzendo perchè non riesco a cambiare il tipo di progressdialog da Horizontal a Spinner dopo aver eseguito un AsyncTask che mi scarica dei file da internet.
Praticamente voglio scaricare dei file di testo e una volta scaricati analizzarli e salvare dei valori presi dai file nel mio database.
Quando scarico uso un progressDialog con stile Horizontal per far vedere all'utente il progresso nello scaricamento dei file, una volta finito vorrei che questo progressDialog diventi uno spinner che "ruoti" finchè non ho finito di analizzare tutti i valori..
Questo è il mio codice:

Override dell'OnCreateDialog:
Codice (Java): [Seleziona]
@Override
        protected Dialog onCreateDialog(int id) {
                switch (id) {
                case DIALOG_DOWNLOAD_PROGRESS:
                        mProgressDialog = new ProgressDialog(this);
                        mProgressDialog.setMessage("Scaricamento file...");
                        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        mProgressDialog.setCancelable(false);
                        mProgressDialog.setIndeterminate(false);
                        mProgressDialog.show();
                        break;
                case DIALOG_SPINNER_ID:
                        mProgressDialog = new ProgressDialog(this);
                        mProgressDialog.setMessage("Elaborando file appena scaricati...");
                        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                        mProgressDialog.setCancelable(false);
                        mProgressDialog.setIndeterminate(true);
                        mProgressDialog.show();
                        break;
                default:
                        mProgressDialog = null;
                        break;
                }
                return mProgressDialog;
        }

AsyncTask:
Codice (Java): [Seleziona]
class DownloadFileAsync extends AsyncTask<String, String, String> {

                @Override
                protected void onPreExecute() {
                        super.onPreExecute();
                        showDialog(DIALOG_DOWNLOAD_PROGRESS);
                }

                @Override
                protected String doInBackground(String... tutti) {

                        int count;

                        String[] urls = getUrlsFile();

                        for (int i = 0; i < urls.length; i++) {

                                try {
                                        URL url = new URL(urls[i]);
                                        URLConnection conexion = url.openConnection();
                                        conexion.connect();

                                        int lenghtOfFile = conexion.getContentLength();

                                        InputStream input = new BufferedInputStream(
                                                        url.openStream());
                                        OutputStream output = new FileOutputStream("/sdcard/"
                                                        + urls[i].substring(urls[i].lastIndexOf('/') + 1,
                                                                        urls[i].length()));

                                        byte data[] = new byte[1024];

                                        long total = 0;

                                        while ((count = input.read(data)) != -1) {
                                                total += count;
                                                publishProgress(""
                                                                + (int) ((total * 100) / lenghtOfFile));
                                                output.write(data, 0, count);
                                        }

                                        output.flush();
                                        output.close();
                                        input.close();
                                } catch (Exception e) {

                                }
                        }

                        return null;

                }

                protected void onProgressUpdate(String... progress) {
                        super.onProgressUpdate(progress);
                        mProgressDialog.setProgress((Integer.parseInt(progress[0])));
                }

                @Override
                protected void onPostExecute(String unused) {

                        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);

                        showDialog(DIALOG_SPINNER_ID);

                        analizzaFileAppenaScaricati();

                        dismissDialog(DIALOG_SPINNER_ID);

                }

        }

Il problema è che il progressDialog mi rimane bloccato mentre faccio le operazioni sui file, e l'applicazione non risponde..

Ho provato anche a mettere il dismissDialog nel doinBackground, così facendo il dialog relativo al download scompare, ma non ricompare quello relativo allo spinner (anche se le operazioni sul file vengono effettuate)..
Come posso risolvere? Grazie in anticipo..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Cambiare il tipo di ProgressDialog da Horizontal a Spinner dopo un AsyncTask
« Risposta #1 il: 23 Settembre 2011, 12:47:27 CEST »
0
Secondo me una cosa del genere, che non è proprio pulitissima, dovrebbe funzionare:

Codice (Java): [Seleziona]
class DownloadFileAsync extends AsyncTask<String, String, String> {

                @Override
                protected void onPreExecute() {
                        super.onPreExecute();
                        showDialog(DIALOG_DOWNLOAD_PROGRESS);
                }

                @Override
                protected String doInBackground(String... tutti) {

                        int count;

                        String[] urls = getUrlsFile();

                        for (int i = 0; i < urls.length; i++) {

                                try {
                                        URL url = new URL(urls[i]);
                                        URLConnection conexion = url.openConnection();
                                        conexion.connect();

                                        int lenghtOfFile = conexion.getContentLength();

                                        InputStream input = new BufferedInputStream(
                                                        url.openStream());
                                        OutputStream output = new FileOutputStream("/sdcard/"
                                                        + urls[i].substring(urls[i].lastIndexOf('/') + 1,
                                                                        urls[i].length()));

                                        byte data[] = new byte[1024];

                                        long total = 0;

                                        while ((count = input.read(data)) != -1) {
                                                total += count;
                                                publishProgress(""
                                                                + (int) ((total * 100) / lenghtOfFile));
                                                output.write(data, 0, count);
                                        }

                                        output.flush();
                                        output.close();
                                        input.close();
                                } catch (Exception e) {

                                }
                        }

                                                publishProgress("finish");
                                                analizzaFileAppenaScaricati();
                                               
                        return null;

                }

                protected void onProgressUpdate(String... progress) {
                        super.onProgressUpdate(progress);
                                               
                                                if(!progress.equals("finish")){
                                mProgressDialog.setProgress((Integer.parseInt(progress[0])));
                                                }else{
                                                        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
                                showDialog(DIALOG_SPINNER_ID);
                                                }
                }

                @Override
                protected void onPostExecute(String unused) {
                        dismissDialog(DIALOG_SPINNER_ID);
                }

        }

Nei tuoi tentativi non avevi tenuto conto che:
-Mostrare e nascondere i dialog devono essere fatti nel thread della UI
-Le operazioni "lunghe" devono essere fatte nel thread in background (pena l'activity che si blocca)

Offline madelu86

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    madelu86
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:Cambiare il tipo di ProgressDialog da Horizontal a Spinner dopo un AsyncTask
« Risposta #2 il: 23 Settembre 2011, 13:40:56 CEST »
0
Grazie mille...funziona, ma ho dovuto cambiare una cosa del tuo codice:

Codice (Java): [Seleziona]
if (!(progress[0].equals("finish"))) {
                                mProgressDialog.setProgress((Integer.parseInt(progress[0])));
                        } else {
                                dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
                                showDialog(DIALOG_SPINNER_ID);
                        }

nella condizione dell'if nel metodo onProgressUpdate ho messo progress[0], invece di progress ed ho aggiunto una parentesi (veniva lanciata eccezione nel parsing in integer) !

Ora mi da un errore nel metodo analizzaFileAppenaScaricati(), ma vedrò di risolverlo da solo!

Grazie di nuovo!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Cambiare il tipo di ProgressDialog da Horizontal a Spinner dopo un AsyncTask
« Risposta #3 il: 23 Settembre 2011, 13:42:52 CEST »
0
Grazie mille...funziona, ma ho dovuto cambiare una cosa del tuo codice

L'ho modificato con notepad... mi era sfuggita quella cosa :P