2010-04-14 24 views
10

Sto cercando di scaricare file di grandi dimensioni da Internet (> 20Mb)Android: scarica file di grandi dimensioni

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!"); 
    } 
} 

Se finestra di dialogo I linea di rimuovere il commento

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

dopo 7-15% scaricano progressbar respingere e Vedo "finire!" nel registro. Perché?

+0

lo hai provato nel dispositivo o nell'emulatore ?? se lo hai provato in emulatore, allora non funziona correttamente. perché hai bisogno di una configurazione di sistema alta. Emulatore – Praveen

+0

. ok, proverò sul dispositivo – embo

+0

sì, sul dispositivo funziona bene! – embo

risposta

5

Si dovrebbe prendere in considerazione l'implementazione di intervalli HTTP. Questo ti consentirà di riavviare il download quando fallisce.

Per quanto riguarda il motivo per cui si ferma, alcuni gestori implementano i limiti di download che interromperanno una connessione dopo un determinato periodo di tempo o di download. Ho visto questa prima mano su un vettore del Regno Unito e ne sono stato informato su altri. Di solito è facile verificare il limite provando a scaricare il file tramite il browser Androids e se lo vedi arrestare o interrompere si sa che è più probabile un problema con l'operatore (e sì, il download può essere interrotto senza generare un'eccezione).

Un'implementazione Http Range consente di continuare il download dal punto in cui era stata interrotta e quindi il metodo doInBackground di utilizzare un algoritmo di sospensione e ripresa in modo che ogni volta che la connessione viene interrotta, si attende un certo periodo di tempo. prova a riprendere da dove il download è stato interrotto (e, ovviamente, implementa un limite di tentativi in ​​modo da non finire con un ciclo infinito quando il telefono non può davvero scaricare il file).

Problemi correlati