2010-04-14 6 views
10

Je suis en train de télécharger à partir d'Internet fichier volumineux (> 20Mo)Android: télécharger gros fichier

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 je ligne uncomment

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

après dialogue 7-15% téléchargement progressbar et rejeter Je vois "finir!" dans Log. Pourquoi?

+0

avez-vous essayé dans un périphérique ou un émulateur ?? Si vous l'avez essayé en émulateur, cela ne fonctionne pas correctement. parce que vous avez besoin de haute configuration du système. – Praveen

+0

émulateur. ok, je vais essayer sur l'appareil – embo

+0

oui, sur le travail de l'appareil bien! – embo

Répondre

5

Vous devriez envisager d'implémenter des plages HTTP. Cela vous permettra de redémarrer votre téléchargement en cas d'échec. Pour ce qui est de l'arrêt, certains opérateurs implémentent des limites de téléchargement qui interrompent une connexion après un certain temps ou un certain montant de téléchargement. J'ai vu cela de première main sur un transporteur britannique et on m'en a parlé sur d'autres. Il est généralement facile de vérifier la limite en essayant de télécharger le fichier via le navigateur Androids et si vous le voyez caler ou arrêter, vous savez qu'il s'agit probablement d'un problème de support (et oui, le téléchargement peut être terminé sans lancer d'exception). Une implémentation Http Range vous permettra de continuer le téléchargement là où elle s'est arrêtée et donc votre méthode doInBackground pour utiliser un algorithme de retenue et de reprise de sorte que chaque fois que la connexion est interrompue, vous attendez un certain temps essayez de reprendre là où le téléchargement s'est arrêté (et, bien sûr, implémentez une limite de réessai afin de ne pas vous retrouver avec une boucle infinie lorsque le téléphone ne peut vraiment pas télécharger le fichier).

Questions connexes