Android: скачать большой файл - PullRequest
10 голосов
/ 14 апреля 2010

Я пытаюсь загрузить большой файл из Интернета (> 20 Мб)

private class DownloadTask extends AsyncTask<DatabaseInfo, Integer, String> {

    private DatabaseInfo info;

    protected String doInBackground(DatabaseInfo... dbInfo) {

        int count;
        info = dbInfo[0];

        try {

            URL url = new URL(dbInfo[0].dbPath);

            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream("/sdcard/db.zip");

            byte data[] = new byte[1024];
            int total = 0;

            while ((count = input.read(data)) != -1) {

                //output.write(data, 0, count);

                total += count;

                if (total % 10240 == 0) {
                    publishProgress(total);
                }
            }

            output.flush();
            output.close();
            input.close();
        } 
        catch (Exception e) {
            Log.e("err", e.getMessage());
        }

        return null;
    }

    protected void onProgressUpdate(Integer... total) {

        int perc = (int) ((float) total[0] / (float) info.dbZipSize * 100);
        mProgressDialog.setProgress(perc);
    }

    protected void onPostExecute(String s) {

        dismissDialog(DIALOG_PROGRESS);
        Log.e("err", "finish!");
    }
}

Если я раскомментирую строку

//output.write(data, 0, count);

после 7-15% загрузки диалоговое окно прогресса закрывается, и я вижу "готово!" в лог. Почему?

1 Ответ

5 голосов
/ 01 июля 2010

Вы должны взглянуть на реализацию HTTP-диапазонов. Это позволит вам перезапустить загрузку при сбое.

Относительно того, почему это прекращается, некоторые операторы устанавливают ограничения на загрузку, которые разрывают соединение через определенное время или объем загрузки. Я видел это из первых рук на одном британском перевозчике, а мне рассказывали об этом на других. Обычно легко проверить ограничение, пытаясь загрузить файл через браузер Android, и если вы видите, что он останавливается или останавливается, вы знаете, что это, скорее всего, проблема с носителем (и да, загрузка может быть прервана без исключения).

Реализация Http Range позволит вам продолжить загрузку с того места, где она была остановлена, и, таким образом, ваш метод doInBackground будет использовать алгоритм задержки и возобновления, так что каждый раз, когда соединение прерывается, вы ждете некоторое время, а затем попробуйте возобновить с того момента, когда загрузка прекратилась (и, конечно, установить ограничение на повторные попытки, чтобы вы не получили бесконечный цикл, когда телефон действительно не может загрузить файл).

...