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 の 9383138

ご覧のとおり、私の計算の一部が間違っています。たぶん、私はさまざまな種類の単位で数学をやっています。

手伝って頂けますか?

ありがとう!!

4

4 に答える 4

1

ダウンロードのサイズが非常に大きい場合は、AsynTask を使用しないでください。それらはこのために設計されていません: https://stackoverflow.com/a/13082084/693752

あなたは2つの解決策を得ました:

  • あなたのニーズに合わせてAndroidのネイティブ ダウンロード マネージャーを使用してください。
  • 取り扱いの良いライブラリを使用してください。RoboSpice github のリポジトリをご覧ください。気に入らない場合は、ページの下部で代替ライブラリを見つけることができます。
于 2013-10-08T09:28:21.867 に答える
1

buffer.length の代わりに bytesRead を加算してみてください。

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

それはダウンロードされたバイト数ではありません

counter+=bytesRead;

は。bytesReadファイルにバイトを書き込むのと同じように

于 2013-10-08T09:19:03.257 に答える
0

bytesRead を使用してカウンタをインクリメントします

counter += bytesRead;
于 2013-10-08T09:24:20.277 に答える