2011-04-02 105 views
3

我正在尝试制作一个应用程序,可以帮助我评估从Web资源下载文件的时间。我发现2个样品:更新进度对话框

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

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

第二个例子显示了一个更小的下载时间,但我不知道如何使用它来更新进度对话框。我认为应该用第二种情况下的“while”表达来完成,但我找不到。有人能给我任何建议吗?

UPD:

第一代码:

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; 

第二码:

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

所以事情是,第一种方法似乎是慢约30%。

回答

2

second example可能运行得更快,但它独占了GUI线程。 first approach,使用AsyncTask更好;它允许GUI在下载过程中保持响应。

我发现将AsyncTaskSwingWorker相比较很有帮助,如此example所示。

+0

我在Asynctask中执行第二种方法。 – StalkerRus 2011-04-02 18:31:15

+0

那么,第一个代码有一个1024字节的缓冲区,而第二个只有50个。 – trashgod 2011-04-02 18:38:00

+0

我试图减少到50的缓冲区。但我没有看到任何性能的变化。 – StalkerRus 2011-04-02 18:53:29

1

第一个环节是最好的。但我无法提供代码(这是家庭比较)在星期一或以后我可以提供完整的功能。但是:

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; 
    } 

这个类最适合它(imho)。 publishProgress它是一个简单的函数,其中最多有两行。设置最大和设置电流。如何在这段代码中看到lenghtOfFile这是ur文件有多少个字节。 total - 当前进度(示例25从100字节)。轻松运行这门课程:DownloadFile a = new DownloadFile(); a.execute(value,value);//or null if u not using value.希望你能理解我,我不会说英语。

+0

我明白它是如何工作的,但我发现使用第一个代码我下载的文件比使用第二个代码慢大约30%。我不明白为什么。 – StalkerRus 2011-04-02 18:21:09

+0

代码引用:http://stackoverflow.com/questions/3028660 – trashgod 2011-04-02 18:21:48

+0

字节数据[] =新字节[1024];你需要在这里设置新的值,例如16000。它的incresa下载速度 – Peter 2011-04-02 20:23:36