2010-04-14 23 views
10

Estoy intentando descargar archivo grande de Internet (> 20 MB)Android: descarga de archivos grandes

private class DownloadTask extends AsyncTask<DatabaseInfo, Integer, String> { 

    private DatabaseInfo info; 

    protected String doInBackground(DatabaseInfo... dbInfo) { 

     int count; 
     info = dbInfo[0]; 

     try { 

      URL url = new URL(dbInfo[0].dbPath); 

      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream("/sdcard/db.zip"); 

      byte data[] = new byte[1024]; 
      int total = 0; 

      while ((count = input.read(data)) != -1) { 

       //output.write(data, 0, count); 

       total += count; 

       if (total % 10240 == 0) { 
        publishProgress(total); 
       } 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
     } 
     catch (Exception e) { 
      Log.e("err", e.getMessage()); 
     } 

     return null; 
    } 

    protected void onProgressUpdate(Integer... total) { 

     int perc = (int) ((float) total[0]/(float) info.dbZipSize * 100); 
     mProgressDialog.setProgress(perc); 
    } 

    protected void onPostExecute(String s) { 

     dismissDialog(DIALOG_PROGRESS); 
     Log.e("err", "finish!"); 
    } 
} 

Si descartar que la línea uncomment

//output.write(data, 0, count); 

después de la descarga de diálogo progressbar 7-15% y Veo "terminar" en Log. ¿Por qué?

+0

¿Lo has probado en dispositivo o emulador? si lo probaste en emulador, entonces no funciona correctamente. porque necesitas una configuración de sistema alta – Praveen

+0

emulador. vale, lo intentaré en el dispositivo – embo

+0

sí, en el dispositivo funciona bien! – embo

Respuesta

5

Debería tener en cuenta implementar rangos HTTP. Esto le permitirá reiniciar su descarga cuando falle.

En cuanto a por qué se detiene, algunos operadores implementan límites de descarga que dejarán caer una conexión después de un cierto tiempo o cantidad de descarga. He visto esto de primera mano en una compañía del Reino Unido y me han informado de ello en otros. Por lo general, es fácil verificar el límite tratando de descargar el archivo a través del navegador Androids, y si ves que se paralo o te detengas, es muy probable que sea un problema del operador (y sí, la descarga puede finalizar sin lanzar una excepción).

Una implementación de Http Range le permitirá continuar la descarga desde donde quedó y, por lo tanto, su método doInBackground para usar un algoritmo de retención y reanudación de modo que cada vez que se interrumpa la conexión, espere una cantidad de tiempo luego intente reanudar dónde quedó la descarga (y, por supuesto, implemente un límite de reintento para que no termine con un bucle infinito cuando el teléfono realmente no puede descargar el archivo).

Cuestiones relacionadas