今天我試圖實現一個文件下載,通知有多少個字節已經下載(如「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,一些我的計算是錯誤的。也許我正在用不同類型的單位進行數學計算。
你能幫我嗎?
謝謝!
你們都是對的。現在它工作正常。然而,Gil Moshayof在30秒之前給出了答案! – Reinherd