Android: загрузите большой файл

Я пытаюсь загрузить большой файл с Интернета (> 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%, загружающих progressbar диалоговое окно, отклоняют, и я вижу "конец!" в Журнале. Почему?

11
задан Vic 20 July 2013 в 19:22
поделиться

1 ответ

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

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

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

5
ответ дан 3 December 2019 в 11:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: