Android ProgressDialog no funciona con la red móvil
He desarrollado un asynctask simple que descarga un archivo de un sitio web y lo muestra.
Hay un comportamiento extraño:
Cuando utilizo una conexión inalámbrica
El ProgressDialog se muestra correctamente al principio de la descarga
El ProgressDialog se actualiza correctamente de 0% a 100%
Cuando se termina la descarga desaparece y se abre el archivo PDF.
- El diálogo de progreso de Android no se muestra en AsyncTask
- Temporizador de cuenta atrás Android La barra de progreso circular no coincide con el temporizador
- Android Descargar Progress
- Mostrar una barra de progreso cuando se está cargando una actividad
- Cambio del mensaje de diálogo de progreso durante la ejecución
Cuando uso una conexión 3G / Móvil
El ProgressDialog se muestra correctamente al principio de la descarga
El ProgressDialog permanece en 0%
Cuando se termina la descarga desaparece y el archivo PDF se abre correctamente.
¿Cual podría ser el problema? (Estoy usando Android 2.3.7)
¡Gracias!
public class TamTam extends Activity { public ProgressDialog mProgressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mProgressDialog = new ProgressDialog(TamTam.this); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); new DownloadFileAsync().execute("http://www.*******.com/file.pdf"); } class DownloadFileAsync extends AsyncTask<String, Integer, String> { String fileName; @Override protected void onPreExecute() { super.onPreExecute(); mProgressDialog.show(); } @Override protected String doInBackground(String... aurl) { int count; try { URL url = new URL(aurl[0]); URLConnection conexion = url.openConnection(); conexion.connect(); int lenghtOfFile = conexion.getContentLength(); fileName="output.pdf"; InputStream input = new BufferedInputStream(url.openStream()); OutputStream output = new FileOutputStream(new File( Environment.getExternalStorageDirectory() + "/" + fileName)); byte data[] = new byte[1024]; count = 0; long total = 0; while ((count = input.read(data)) > 0) { 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(Integer... progress) { mProgressDialog.setProgress(progress[0]); } @Override protected void onPostExecute(String unused) { mProgressDialog.dismiss(); showPdf(fileName); } } public void showPdf(String fileName) { .... } }
- ¿Cómo se puede generar una pantalla de carga en Android?
- Android ExoPlayer onProgressChanged
- Agregar un retardo a Progress Dialog
- Barra de progreso personalizada en Android?
- Android ProgressDialog con el problema de roscado
- ¿Hay alguna forma de obtener el progreso de subida correctamente con HttpUrlConncetion?
- Android: Cómo ocultar el progreso de Seekbar?
- AsyncTask o Handler- ¿Cuál es mejor para la interacción y el procesamiento de la red que consumen mucho tiempo?
Como dijo Mike, el problema era con esta línea:
int lenghtOfFile = conexion.getContentLength();
El problema era que el encabezado de contenido-longitud no había sido proporcionado por el servidor. Usando una solicitud HEAD, tengo el servidor para responder con el campo de longitud de contenido correcto que de lo contrario estaba vacío. Para especificar el método de solicitud tuve que usar HttpURLConnection, en lugar de URLConnection.
Así que he cambiado este bloque
URLConnection conexion = url.openConnection(); conexion.connect(); int lenghtOfFile = conexion.getContentLength();
con este
HttpURLConnection conexion2 = (HttpURLConnection) url.openConnection(); conexion2.setRequestMethod("HEAD"); int lenghtOfFile = conexion2.getContentLength(); URLConnection conexion = url.openConnection(); conexion.setDoOutput(true); conexion.connect();
Fuentes:
http://en.wikipedia.org/wiki/Chunked_transfer_encoding
Java URLConnection: ¿cómo puedo averiguar el tamaño de un archivo web?
- Cómo escribir sólo registros de aplicación en un archivo externo en android
- Cómo eliminar la foto cargada de la pared de facebook de la aplicación