今日、ファイルのダウンロードを実装しようとしていますが、既にダウンロードされたバイト数に関する通知が表示されます (「150Mb の 1Mb がダウンロードされました」など)。しかし、私はいくつかの数学で立ち往生しています。
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'}");
}
}
上記のコードからわかるように、いくつかの点に注意する必要があります。
- ダウンロードが始まるとすぐに、ダウンロードするファイルの長さを取得します。
- その間、すべてのループで、TextView をダウンロードしたサイズで更新するためのコールバックがあります。
必要なものはすべて揃っていますが、今何をすべきかわかりません。
例:
- ファイルサイズ:9383138バイト
- 毎ループ: 8192 バイト
ただし、コールバックでこれを行いました:
Log.d("debugging","we downloaded: "+counter+" of "+size);
そして、それが終わるとき、それは言います:
ダウンロードしました: 26206208 の 9383138
ご覧のとおり、私の計算の一部が間違っています。たぶん、私はさまざまな種類の単位で数学をやっています。
手伝って頂けますか?
ありがとう!!