2011-04-02 6 views
3

J'essaie de créer une application qui peut m'aider à évaluer le temps de téléchargement du fichier à partir d'une ressource Web. J'ai trouvé 2 échantillons:Mise à jour de la boîte de dialogue de progression

Download a file with Android, and showing the progress in a ProgressDialog

et

http://www.helloandroid.com/tutorials/how-download-fileimage-url-your-device

Le deuxième exemple montre un petit temps de téléchargement, mais je ne peux pas comprendre comment mettre à jour dialogue de progression de l'utiliser. Je pense que quelque chose devrait être fait avec "tandis que" l'expression dans le deuxième cas, mais je ne peux pas trouver quoi. Quelqu'un pourrait-il me donner un conseil?

UPD:

1er code:

try { 
      time1 = System.currentTimeMillis(); 
      URL url = new URL(path); 
      URLConnection conexion = url.openConnection(); 
      conexion.connect(); 
      // this will be useful so that you can show a tipical 0-100% progress bar 
      int lenghtOfFile = conexion.getContentLength(); 
      // downlod the file 
      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream("/sdcard/analyzer/test.jpg"); 

      byte data[] = new byte[1024]; 

      long total = 0; 

      time11 = System.currentTimeMillis(); 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       // publishing the progress.... 
       publishProgress((int)(total*100/lenghtOfFile)); 
       output.write(data, 0, count); 
      } 
      time22= System.currentTimeMillis()-time11; 
      output.flush(); 
      output.close(); 
      input.close(); 


     } catch (Exception e) {} 

     timetaken = System.currentTimeMillis() - time1; 

2ème code:

 long time1 = System.currentTimeMillis(); 
     DownloadFromUrl(path, "test.jpg"); 
     long timetaken = System.currentTimeMillis() - time1; 

public void DownloadFromUrl(String imageURL, String fileName) { //this is the downloader method 
try { 
     URL url = new URL(imageURL); //you can write here any link 
     File file = new File(fileName); 

     /*Open a connection to that URL. */ 
     URLConnection ucon = url.openConnection(); 

     /* 
      * Define InputStreams to read from the URLConnection. 
      */ 
     InputStream is = ucon.getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(is); 

     /* 
      * Read bytes to the Buffer until there is nothing more to read(-1). 
      */ 
     ByteArrayBuffer baf = new ByteArrayBuffer(50); 
     int current = 0; 
     while ((current = bis.read()) != -1) { 
       baf.append((byte) current); 
     } 

     /* Convert the Bytes read to a String. */ 
     FileOutputStream fos = new FileOutputStream(PATH+file); 
     fos.write(baf.toByteArray()); 
     fos.close(); 

} catch (IOException e) { 
     Log.d("ImageManager", "Error: " + e); 
} 

Donc, la chose est que la première méthode semble être plus lent pour environ 30%.

Répondre

2

Le second example peut s'exécuter plus rapidement, mais il monopolise le thread graphique. Le first approach, en utilisant AsyncTask, est le meilleur; il permet à l'interface graphique de rester réactif au fur et à mesure du téléchargement. J'ai trouvé utile de comparer AsyncTask avec SwingWorker, comme indiqué dans ce example.

+0

J'exécute la 2ème méthode dans Asynctask. – StalkerRus

+0

Eh bien, le 1er code a un tampon de 1024 octets, tandis que le second n'en a que 50. – trashgod

+0

J'ai essayé de réduire la mémoire tampon à 50. Mais je n'ai vu aucun changement dans les performances. – StalkerRus

1

le premier lien est le meilleur. Mais je ne peux pas fournir le code (c'est comp maison) lundi ou plus tard, je peux fournir une fonction complète. Mais:

private class DownloadFile extends AsyncTask<String, Integer, String>{ 
    @Override 
    protected String doInBackground(String... url) { 
     int count; 
     try { 
      URL url = new URL(url[0]); 
      URLConnection conexion = url.openConnection(); 
      conexion.connect(); 
      // this will be useful so that you can show a tipical 0-100% progress bar 
      int lenghtOfFile = conexion.getContentLength(); 

      // downlod the file 
      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream("/sdcard/somewhere/nameofthefile.ext"); 

      byte data[] = new byte[1024]; 

      long total = 0; 

      while ((count = input.read(data)) != -1) { 
       total += count; 
       // publishing the progress.... 
       publishProgress((int)(total*100/lenghtOfFile)); 
       output.write(data, 0, count); 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
     } catch (Exception e) {} 
     return null; 
    } 

cette classe sont les meilleurs pour cela (imho). publishProgress c'est une fonction simple où vous avez deux lignes max. Définissez max et définissez le courant. Comment pouvez-vous voir dans ce code lenghtOfFile c'est combien d'octets ont votre fichier ur. total -progrès en cours (exemple 25 sur 100 octets). Exécutez cette classe facile: DownloadFile a = new DownloadFile(); a.execute(value,value);//or null if u not using value. J'espère que vous me comprenez, je ne parle pas bien l'anglais.

+0

Je comprends comment cela fonctionne, mais j'ai découvert qu'en utilisant le 1er code, je télécharge un fichier environ 30% plus lent que d'utiliser un second code. Je ne peux pas comprendre pourquoi. – StalkerRus

+0

Référence de code: http://stackoverflow.com/questions/3028660 – trashgod

+0

octet de données [] = nouvel octet [1024]; Vous devez définir une nouvelle valeur ici, par exemple 16000. Et c'est la vitesse de téléchargement incresa – Peter

Questions connexes