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.

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) { .... } } 

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 implementar un ProgressDialog mientras que Activity solicita un SoapObject desde un Servicio Web?
  • Reexcursión de exoplayer de Android cuando se realiza la búsqueda
  • ProgressDialog rechaza después de girar la pantalla
  • No FEATURE_INDETERMINATE_PROGRESS en ActionBarCompat para Android 2.3-
  • FindViewById (android.R.id.progress) devuelve null
  • Vista del temporizador android (al igual que la barra de progreso) actualizando con colores en Lienzo
  • ProgressDialog en AsyncTask
  • Diálogo de progreso de Android
  • Uso de ProgressDialog en ActionBar (Android)
  • show ProgressBar o Dialog de un IntentService para el progreso de la descarga
  • Mostrar ProgressDialog Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.