2013-10-08 89 views
1

今天我試圖實現一個文件下載,通知有多少個字節已經下載(如「1Mb的150Mb下載」)。但是,我陷入了一些數學困境。實現「從Y下載的X字節」

class DescarregarFitxer extends AsyncTask<String,String,String>{ 
    final String rutaDesti; 
    final String urlOrigen; 
    URLConnection urlConnect; 
    View v; 
    byte[] buffer = new byte[8 * 1024]; 

    public DescarregarFitxer(String rutaDesti, String urlOrigen, View v){ 
     this.rutaDesti = rutaDesti; 
     this.urlOrigen = urlOrigen; 
     this.v = v; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

    } 

    protected String doInBackground(String... params) { 
     try{ 
      int size = 0; 
      int counter = 0; 
      URL url = new URL(urlOrigen); 
      urlConnect = url.openConnection(); 
      size = urlConnect.getContentLength(); 
      productView.this.callBackDownload(v, "{'action':'start','size':'"+size+"'}"); 
      InputStream input = urlConnect.getInputStream(); 
      try { 
       OutputStream output = new FileOutputStream(rutaDesti); 
       try { 
        int bytesRead; 
        while ((bytesRead = input.read(buffer)) != -1) { 
         output.write(buffer, 0, bytesRead); 
         counter+=buffer.length; 
         productView.this.callBackDownload(v, "{'action':'update','size':'"+size+"','counter':'"+counter+"'}"); 
        } 
       } finally { 
        output.close(); 
       } 
      } finally { 
       input.close(); 
      } 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     productView.this.callBackDownload(v, "{'action':'done'}"); 
    } 
} 

正如你可以在上面的代碼中看到,幾件事情必須注意:

  • 一旦下載開始,我得到的文件lenght被下載。
  • 每一次循環,我都有一個回調來更新下載的大小的TextView。

我有我需要的一切,但我不知道現在做什麼。

例子:

  • 文件大小:9383138個字節
  • 每一個循環:8192個字節

但是,我在回調做:

Log.d("debugging","we downloaded: "+counter+" of "+size); 

而且,當它說:

我們下載:9383138

正如你所看到的26206208,一些我的計算是錯誤的。也許我正在用不同類型的單位進行數學計算。

你能幫我嗎?

謝謝!

回答

1

嘗試添加bytesRead而不是buffer.length。

1
counter+=buffer.length; 

這不是字節的下載量

counter+=bytesRead; 

是。就像你寫bytesRead字節文件

+0

你們都是對的。現在它工作正常。然而,Gil Moshayof在30秒之前給出了答案! – Reinherd

0

使用bytesRead以反

counter += bytesRead; 
1

被increament對於一個非常大的下載,你不應該使用的AsynTask。他們沒有采用這種設計方:https://stackoverflow.com/a/13082084/693752

你有2個解決方案:

+0

這個問題陳述了我已經控制的一些問題(當活動被銷燬時,我取消了AsyncTask)。現在我會繼續使用它,如果它沒有任何麻煩。一旦我有了,我會記住這一點,並會採取更好的方法。感謝您的建議!! – Reinherd

相關問題