Подтвердить что ты не робот

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% загрузки диалогового окна прогрессивной развертки, и я вижу "закончить!". в журнале. Почему?

4b9b3361

Ответ 1

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

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

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