AsyncTask – descarga lenta

Estoy utilizando AsyncTask para descargar ~ 50 MB de archivos de Internet. A veces, cuando descargo este archivo, la ganancia de la barra de progreso es muy lenta (incluso cuando estoy en Wi-Fi). Y después de un minuto, el teléfono me muestra, descarga completa, pero el archivo en sí tiene sólo ~ 100kB, no más. Pero cuando recomiendo el dispositivo, e intento descargar el archivo, la transferencia directa se ejecuta brevemente y rápidamente. ¿Alguien se ha enfrentado al mismo problema? ¿Necesito borrar la misma memoria de descarga antes de descargar un nuevo archivo? Estoy descargando el archivo a Environment.externalStoryDirectory ().

Gracias

Llamando descarga de la actividad:

mProgressDialog = new ProgressDialog(ItemDetails.this); mProgressDialog.setTitle("Downloading"); mProgressDialog.setMessage("Downloading sth..."); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); DownloadMapTask downloadFile = new DownloadMapTask(ItemDetails.this); downloadFile.execute(web_location_url); mProgressDialog.show(); 

Descargar Async Task (two methods):

 @Override protected String doInBackground(String... urls) { int count; PATH=maps_loc+"/Android/data/test/maps/"; try { URL url = new URL(urls[0]); HttpURLConnection connection2 = (HttpURLConnection) url.openConnection(); connection2.setRequestMethod("GET"); connection2.setDoOutput(true); connection2.connect(); int lenghtOfFile = connection2.getContentLength(); File apkdir = new File(PATH); apkdir.mkdirs(); File newInstall = new File(PATH, name+".tmp"); InputStream input = new BufferedInputStream(url.openStream()); OutputStream output = new FileOutputStream(newInstall); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1 && running==true) { total += count; publishProgress((int) (total * 100 / lenghtOfFile)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (Exception e) { e.printStackTrace(); } return null; } public void onProgressUpdate(Integer... args) { ItemDetails.mProgressDialog.setProgress(args[0]); } 

Algunos servidores cierran la conexión si el cliente tiene velocidad lenta y la descarga tarda mucho tiempo, lo cual puede ser el caso si su programa está conectado a Internet a través de datos móviles no Wi-Fi.

Usted debe considerar el respaldo de la descarga de la ayuda en su programa para no comenzar de cero cada vez.

No creo que haya una especie de memoria de descarga que debas borrar. Tengo una aplicación que puede descargar fácilmente más de 50MB sin problemas.

Además, podría considerar la posibilidad de obtener un lock para Wi-Fi y procesador para mantener el programa en ejecución hasta que finalice la descarga.

Editar

En su código, trate de imprimir el valor de la lenghtOfFile después de la línea int lenghtOfFile = connection2.getContentLength(); Para asegurarse de que es el mismo que el tamaño de archivo real que está descargando.

A continuación se muestra un código de ejemplo alternativo que admite el resume que estoy usando en mis proyectos. (Es sólo para ilustrar la idea, tendrá que modificar el código a sus necesidades)

 HttpClient httpClient = new DefaultHttpClient(); HttpGet request = new HttpGet(new URI(fileURL))); HttpResponse response; InputStream is = null; FileOutputStream fos = null; try { boolean continueDownloading = false; String tmpFileName = fileName + "_tmp"; outputFile = new File(downloadFolder, tmpFileName); if (outputFile.exists()) { localFileLength = outputFile.length(); if (localFileLength > 0) { continueDownloading = true; } if (continueDownloading) { request.addHeader("Range", "bytes=" + localFileLength + "-"); } response = httpClient.execute(request); long remoteFileLength = 0; Header contentLengthHeader = response.getFirstHeader("Content-Length"); if (contentLengthHeader != null) { remoteFileLength = Integer.parseInt(contentLengthHeader.getValue()); } long downloaded = 0; if (continueDownloading) { downloaded = localFileLength; } long fullFileLength = downloaded + remoteFileLength; fos = new FileOutputStream(outputFile, true); is = response.getEntity().getContent(); byte[] buffer = new byte[DOWNLOAD_BUFFER_SIZE]; int len = 0; while ((len = is.read(buffer)) != -1 && isDownloading) { fos.write(buffer, 0, len); downloaded += len; } fos.flush(); boolean success = downloaded == fullFileLength; if (success) { outputFile.renameTo(new File(downloadFolder, fileName)); } } catch (Throwable ex) { ex.printStackTrace(); } finally { // clean up resources } 

Pruebe a usar downloadManager en lugar de descargar manualmente, hay muchas ventajas al usarlo.

Aquí hay un ejemplo: Ejemplo de DownloadManager

Y eche un vistazo a las documentaciones: DownloadManager

  • El navegador de Android no descargará el archivo pdf
  • Cómo obtener mi dispositivo Android Carga de la carpeta de descarga interna
  • Descargar Doc / PDF desde Internet y guardar en la memoria interna
  • Recurso para descargar temas / estilos de aplicación de Android?
  • Implementar pausa / reanudar en la descarga de archivos
  • Descarga simultánea de varios archivos en aplicaciones de Android
  • Cómo reanudar una descarga interrumpida - parte 2
  • Descargar la aplicación si la intención no está instalada
  • Cómo guardar el archivo desde el sitio web a sdcard
  • Contenido de URL desconocido: // downloads / my_downloads
  • ¿Puedo descargar un db de SQLite en / sdcard y acceder desde mi aplicación Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.