Autore Topic: Progress Dialog Ritardataria  (Letto 807 volte)

Offline dacplus

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Dsisre HD
Progress Dialog Ritardataria
« il: 17 Febbraio 2013, 19:42:45 CET »
0
Buonasera a tutti,
è da un po che lotto con un problema a cui non riesco a dare spiegazione. Ho una progressDialog che anzichè comparire, visualizzare le barre che avanzano, e poi chiudersi, si diverte ad a comparire per un millesimo di secondo solo lavoro completato, non permettendo di visualizzare nulla e lasciandomi solo con un frustrante lag dalla pressione del tasto "scarica" alla fine del processo. Commentando il .dismiss() rimane compare la sola progressDialog con il completamento al 100% qui so che funziona.
Qualcuno sa aiutarmi?

Di seguito allego il codice:
Codice (Java): [Seleziona]
package it.dacsoft.nyctaxcalculator.currency;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.Menu;
import android.widget.Toast;

public class DownloadXML {

        private static final int DIALOG_DOWNLOADERROR_ID = 1;

        public void download(Context context) {

                ProgressDialog progressDialog = new ProgressDialog(context);
                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                progressDialog.setMessage("DOWNLOADING");
                progressDialog.setTitle("DOWNLOAD IN PROGRESS");

                progressDialog.show();

                try {
                        URL url = new URL("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");              //indirizzo del file

                        long start = System.currentTimeMillis();                                                                                                //      memorizzo il tempo di partenza download
                       
                        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();                             //creo la connessione

                        urlConnection.setRequestMethod("GET");                                                                                                  //impostazioni della
                        urlConnection.setDoOutput(true);                                                                                                                //connessione

                        urlConnection.connect();                                                                                                                                //apro la connessione

                        File internalRoot = new File(context.getFilesDir().getPath());                                                  //scelgo dove salvare il file
                        File SDCardRoot = new File(Environment.getExternalStorageDirectory().getPath());                //tra SD o memoria interna

                        //File file = new File(SDCardRoot,"currency.xml");                                                                              //aggiungo al path di destinazione il nome che
                        File file = new File(internalRoot,"currency.xml");                                                                              // voglio dare al file e l'estenzione(currency.xmlS)

                        FileOutputStream fileOutput = new FileOutputStream(file);                                                               //creo un FileOutputStream per scrivere il file
                        InputStream inputStream = urlConnection.getInputStream();                                                               //e un FileInputStream per leggere il file da internet

                        int totalSize = urlConnection.getContentLength();                                                                               //calcolo la dimensione totale del file
                       
                        progressDialog.setMax(totalSize);                                                                                                               //aggiungo la dimensione del file alla dialog

                        int downloadedSize = 0;                                                                                                                                 //creo una variabile dove allocare il totale in byte del file

                        byte[] buffer = new byte[1024];                                                                                                                 //creo un buffer e
                        int bufferLength = 0;                                                                                                                                   //uso una variabile per la dimensione temporanea del buffer

                        while ( (bufferLength = inputStream.read(buffer)) > 0 )                                                                 //inizio a scaricare il file
                        {
                                fileOutput.write(buffer, 0, bufferLength);                                                                                      //aggiungo i dati nel buffer al FileOutputStream
                                downloadedSize += bufferLength;                                                                                                         //aggiungo la dimensione per conoscere quanto ho scaricato
                               
                                int progress=(int)(downloadedSize*100/totalSize);                                                                       //variabile progresso in percentuale (attualmente inutilizzata)

                                progressDialog.setProgress(downloadedSize);                                                                                     //      incremento la progress dialog
                        }
                       
                        long stop = System.currentTimeMillis();                                                                                                 //      memorizzo il tempo di fine download
                       
                        long totalTime = (stop-start);
                       
                        Toast.makeText(context, "Downloaded in: "+totalTime+"ms", Toast.LENGTH_LONG).show();
                        fileOutput.close();                                                                                                                                             //      chiudo il file

                }
                catch (Exception e) {
                        String err = "Downloading error! Check internet connection";
                        Toast.makeText(context, err, Toast.LENGTH_LONG).show();
                        e.printStackTrace();

                }
                progressDialog.dismiss();                                                                                                                                       //      chiudo la dialog
        }
}

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Progress Dialog Ritardataria
« Risposta #1 il: 17 Febbraio 2013, 20:46:45 CET »
+1
Il lavoro va fatto in un Thread separato da quello in cui visualizzi il Dialog.
Tra l'altro, da quello che ho capito, stai facendo una richiesta HTTP dentro il thread UI, cosa che non si dovrebbe mai fare (ti causa il lag di cui parli infatti, vedi ANR). Inoltre, se non sbaglio, da API 14 in su (quindi ICS), fare una richiesta di rete in thread UI ti causa un crash..
Postate il LogCat LogCat LogCat LogCat LogCat

Offline dacplus

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Dsisre HD
Re:Progress Dialog Ritardataria
« Risposta #2 il: 20 Febbraio 2013, 14:43:07 CET »
0
Ha funzionato perfettamente, grazie