1

今天我正在尝试实现文件下载,并通知已经下载了多少字节(例如“下载了 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 of 9383138

如您所见,我的一些计算是错误的。也许我正在用不同类型的单位做数学。

你能帮助我吗?

谢谢!!

4

4 回答 4

1

尝试添加 bytesRead 而不是 buffer.length。

于 2013-10-08T09:18:37.537 回答
1
counter+=buffer.length;

这不是下载的字节数

counter+=bytesRead;

是。就像您将bytesRead字节写入文件一样

于 2013-10-08T09:19:03.257 回答
1

对于非常大的下载,您不应该使用 AsynTask。它们不是为此设计的:https ://stackoverflow.com/a/13082084/693752

您有 2 个解决方案:

于 2013-10-08T09:28:21.867 回答
0

使用 bytesRead 与计数器递增

counter += bytesRead;
于 2013-10-08T09:24:20.277 回答