今天我尝试实现文件下载,并通知已经下载了多少字节(例如" 1Mb 150Mb已下载")。但是,我被困在一些数学中。
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'}");
}
}
正如您在上面的代码中所看到的,必须注意以下几点:
我需要的一切,但我不确定现在做什么。
示例:
但是,我在回调中这样做了:
Log.d("debugging","we downloaded: "+counter+" of "+size);
当它结束时,它说:
我们下载了:26206208 of 9383138
正如您所看到的,我的一些计算是错误的。也许我用不同类型的单位做数学。
你能帮助我吗?
谢谢!
答案 0 :(得分:1)
尝试添加bytesRead而不是buffer.length。
答案 1 :(得分:1)
counter+=buffer.length;
这不是下载的字节数
counter+=bytesRead;
时。就像你在文件中写bytesRead
个字节一样
答案 2 :(得分:1)
对于非常大的下载,您不应使用AsynTask。它们不是为此而设计的:https://stackoverflow.com/a/13082084/693752
你有2个解决方案:
答案 3 :(得分:0)
使用bytesRead增加计数器
counter += bytesRead;